Django - 使用Radio Buttons而不是Select for form组件

时间:2015-07-21 12:44:28

标签: python django

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

由于它是ModelForm,我依靠django自动在表单上创建字段。因此,虽然我知道可以通过这样做来更改表单上的每个字段:

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

这些定义目前不存在,我必须创建至少150个这些定义。我确定有一种更好的方法来覆盖窗口小部件选择的位置(可能扩展了ModelForm?)。或者,我可以通过将小部件附加到字段定义来执行此操作吗?

我已经浏览了Django文档和源代码,但我无法找到具有choices kwarg的模型字段的窗口小部件的位置。

2 个答案:

答案 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']}