2015-07-21 175 views
4

我有幾個ModelForm用於構建調查,其模型包含大量問題(每個> 30)。目前,多項選擇題被表示爲<select>元素,但爲了改進UX,我想將其更改爲單選按鈕。Django - 使用單選按鈕而不是選擇表單組件

因爲它是ModelForm,我依靠django自動創建表單中的字段。因此,雖然我知道這是可能通過這樣來改變表單上的每個字段:

class SurveyForm(ModelForm): 
    ... 
    field_one = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect()) 

這些定義目前不存在了,我不得不創建這些定義的至少150。我確定有一個更好的方法來覆蓋構件的選擇(可能是擴展了ModelForm?)。或者,我可以通過將小部件附加到字段定義來做到這一點嗎?

我已經瀏覽了Django文檔和源代碼,但是我找不到在哪裏爲choices kwarg模型字段選擇了窗口小部件。

回答

4

我的第一個想法是,你可以使用formfield_overrides。但是,這將不起作用,因爲您只想覆蓋models.CharField的小部件,而不是所有的models.CharField s。

一種方法是循環顯示__init__方法中的窗體字段,並將所有窗口小部件從forms.Select更改爲forms.RadioInput

class SurveyForm(forms.ModelForm): 
    class Meta: 
     model = Survey 
     fields = ('field_one', 'field_two', ...) 

    def __init__(self, *args, **kwargs): 
     super(SurveyForm, self).__init__(*args, **kwargs) 
     for field in self.fields.values(): 
      if isinstance(field.widget, forms.Select): 
       field.widget = forms.RadioSelect() 

如果你有很多這樣的表單,你可以將這些功能提取到一個mixin中。

4
class MyModelForm(ModelForm): 
    class Meta: 
     widgets = { 
      'field_one': forms.RadioSelect(), 
     } 

可能是你想這樣的:

widgets = {field: forms.RadioSelect() for field in ['field_one', 'field_two']} 
+0

我不想一一列舉,雖然這樣的領域,也有各種形式〜30場,這太緊密結合調查的變化。 – jackweirdy

+0

是的,當然。這只是選擇。你選擇答案。 – f43d65

+0

就我而言,我確實想要列舉這些字段,所以非常感謝您向我致敬! –

相關問題