Django - 使用单选按钮而不是选择表单组件

问题描述:

我有几个ModelForm用于构建调查,其模型包含大量问题(每个> 30)。目前,多项选择题被表示为<select>元素,但为了改进UX,我想将其更改为单选按钮。Django - 使用单选按钮而不是选择表单组件

因为它是ModelForm,我依靠django自动创建表单中的字段。因此,虽然我知道这是可能通过这样来改变表单上的每个字段:

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

这些定义目前不存在了,我不得不创建这些定义的至少150。我确定有一个更好的方法来覆盖构件的选择(可能是扩展了ModelForm?)。或者,我可以通过将小部件附加到字段定义来做到这一点吗?

我已经浏览了Django文档和源代码,但是我找不到在哪里为choices kwarg模型字段选择了窗口小部件。

我的第一个想法是,你可以使用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中。

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

就我而言,我确实想要列举这些字段,所以非常感谢您向我致敬! –