如何在不覆盖 ModelForm 中的字段定义的情况下将 ManyToManyField 小部件更改为 CheckboxSelectMultiple

Posted

技术标签:

【中文标题】如何在不覆盖 ModelForm 中的字段定义的情况下将 ManyToManyField 小部件更改为 CheckboxSelectMultiple【英文标题】:How to change ManyToManyField widget to CheckboxSelectMultiple without overriding field definition in a ModelForm 【发布时间】:2011-03-11 05:09:12 【问题描述】:

我有 django ModelForm 用于具有 ManyToManyField 的模型。我想将此字段的小部件更改为CheckboxSelectMultiple。我可以在不覆盖表单定义中的字段的情况下执行此操作吗?

我经常使用类似这样的代码:

class MyModel(ModelForm):
    m2m_field = forms.ModelMultipleChoiceField(queryset = SomeModel.objects.all(),
                                               widget = forms.CheckboxSelectMultiple())

还有其他方法吗?

编辑:我需要这个用于 Django 1.1.1 项目

【问题讨论】:

【参考方案1】:

如果您使用的是 Django 1.2+,则可以在内部 Meta 类中使用 widgets 元组。

class MyModelForm(forms.ModelForm):
    class Meta:
        widgets = 'm2m_field': forms.CheckboxSelectMultiple

见the documentation。

【讨论】:

酷一个!谢谢!不幸的是,在这个项目中我使用 Django 1.1.1,所以它无济于事,无论如何感谢提示。【参考方案2】:

另一种方法是在 ModelForm 的 init 中执行此操作:

class MyModel(ModelForm):
    def __init__(self, *args, **kwargs):
        super(MyModel, self).__init__(*args, **kwargs)
        self.fields['m2m_field'].widget = forms.CheckboxSelectMultiple()

    [...]

【讨论】:

以上是关于如何在不覆盖 ModelForm 中的字段定义的情况下将 ManyToManyField 小部件更改为 CheckboxSelectMultiple的主要内容,如果未能解决你的问题,请参考以下文章

如何在不覆盖当前数据的情况下更新 Mongoose 中的混合类型字段?

覆盖 ModelForm.save 不会更新所有受影响的字段

如何动态更新ModelForm的初始值?

访问模板中的ModelForm queryset对象字段

如何根据在模型级别定义的枚举字段在 Django Modelform 中呈现单选按钮选择?

Django - 带有 ModelForm 的属性和重新定义的字段?