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']}
我不想一一列举,虽然这样的领域,也有各种形式〜30场,这太紧密结合调查的变化。 – jackweirdy
是的,当然。这只是选择。你选择答案。 – f43d65
就我而言,我确实想要列举这些字段,所以非常感谢您向我致敬! –