为什么在使用 RadioSelect 小部件时必须在 ModelForm 中手动设置选项

Why do I have to set the choices manually in a ModelForm when using RadioSelect widget

我有一个带有 CharField 的模型,该模型已分配了选项。我想使用 RadioSelect() 小部件在 ModelForm 中显示此字段。

如果我在 ModelForm 的 Meta class 中为字段设置小部件,小部件将正确显示,所有选项都作为单选按钮。 (哇!)

class Meta:
    model = Account
    fields = (
        'newsletter_setting',
    )
    widgets = {
        'newsletter_setting': forms.RadioSelect()
    }

但是如果我尝试在 __init__ 方法上设置小部件,则无法选择小部件。

def __init__(self, *args, **kwargs):
    super(AccountEditForm, self).__init__(*args, **kwargs)
    self.fields['newsletter_setting'].widget = forms.RadioSelect()

这是为什么?

您需要重新填充新创建的 RadioSelectchoices 属性:

def __init__(self, *args, **kwargs):
    super(AccountEditForm, self).__init__(*args, **kwargs)
    self.fields['newsletter_setting'].widget = forms.RadioSelect(
                   choices=self.fields['newsletter_setting'].widget.choices)