【问题标题】:Why do I have to set the choices manually in a ModelForm when using RadioSelect widget为什么在使用 RadioSelect 小部件时必须在 ModelForm 中手动设置选项
【发布时间】:2015-03-07 22:40:33
【问题描述】:

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

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

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()

这是为什么?

【问题讨论】:

    标签: django


    【解决方案1】:

    您需要重新填充新创建的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)
    

    【讨论】:

    • 感谢您的回复!如果您以这种方式设置小部件,您知道为什么会出现这种情况吗?与 Meta 类相反?我明白为什么 vanilla django 表单需要它,但对于模型表单,您必须重新设置选择会令人困惑。
    • Windget 的choices 属性在父__init__ 方法中设置。然后你在 Meta 类中定义 windget 这工作正常。但是然后你在AccountEditForm.__init__ 中创建新的小部件,它当然有空的choices。所以你必须从旧的正确启动的小部件中复制选择。
    猜你喜欢
    • 2021-05-14
    • 2022-11-21
    • 2011-10-09
    • 2015-08-01
    • 2015-10-09
    • 2018-04-10
    • 2010-11-09
    • 2011-01-13
    • 2011-06-06
    相关资源
    最近更新 更多