我有几个ModelForm
用于构建调查,其模型包含许多问题(每个> 30)。目前,多项选择问题表示为<select>
元素,但为了改进UX,我想将其更改为单选按钮。
由于它是ModelForm
,我依靠django自动在表单上创建字段。因此,虽然我知道可以通过这样做来更改表单上的每个字段:
class SurveyForm(ModelForm):
...
field_one = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect())
这些定义目前不存在,我必须创建至少150个这些定义。我确定有一种更好的方法来覆盖窗口小部件选择的位置(可能扩展了ModelForm?)。或者,我可以通过将小部件附加到字段定义来执行此操作吗?
我已经浏览了Django文档和源代码,但我无法找到具有choices
kwarg的模型字段的窗口小部件的位置。
答案 0 :(得分:4)
我的第一个想法是你可以使用formfield_overrides
。但是,这不会起作用,因为您只想覆盖具有选择的models.CharField
的窗口小部件,而不是所有models.CharField
。
一种方法是循环遍历__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中。
答案 1 :(得分:4)
class MyModelForm(ModelForm):
class Meta:
widgets = {
'field_one': forms.RadioSelect(),
}
可能你喜欢这个:
widgets = {field: forms.RadioSelect() for field in ['field_one', 'field_two']}