Django ModelForm CheckBox小部件

时间:2009-08-12 19:26:34

标签: python django django-models django-forms

我目前有一个问题,可能会忽略一些非常微不足道的事情。我的模型中有一个字段,应该允许通过复选框表单进行多项选择(它不必是管理屏幕中的复选框,只是在最终用户将看到的表单区域中)。目前我的字段设置如下:

# Type of Media
MEDIA_CHOICES = (
    ('1', 'Magazine'),
    ('2', 'Radio Station'),
    ('3', 'Journal'),
    ('4', 'TV Station'),
    ('5', 'Newspaper'),
    ('6', 'Website'),
)
media_choice = models.CharField(max_length=25,
    choices=MEDIA_CHOICES)

我需要接受它,然后在表单中创建一个复选框可选字段。当我创建一个ModelForm时,它想要一个下拉框。所以我自然会覆盖那个领域,我得到了我想要的复选框。但是,当表单提交时,看起来管理屏幕时似乎没有任何有用的东西。然而,数据库显示我选择了许多东西,这是一个积极的信号。但是,如何才能在管理界面中正确反映这一点?

编辑:FWIW我很乐意接受文档链接作为答案,因为看起来我只是在掩饰明显的东西。

3 个答案:

答案 0 :(得分:15)

在这种情况下,最简单的方法是将选项放入单独的模型中,然后使用ManyToMany关系。之后,您只需覆盖该字段的ModelForm小部件即可使用forms.CheckboxSelectMultiple,Django将自动执行正确的操作。如果你坚持使用CharField,你可能需要做this snippet之类的事情。

@ 2.评论:你是如何重写小部件的?我就是这样做的,它完美无缺:

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

答案 1 :(得分:1)

我刚刚开始研究使用ModelForms进行小部件分配。在我见过的很多例子中,包含了piquadrat,Form的__ init __方法被覆盖了。

我发现这有点令人困惑,只是覆盖所需的字段对我来说更自然:

class SomeModelForm(forms.ModelForm):
    some_field = forms.CharField(choices=MEDIA_CHOICES,
                                 widget=forms.CheckboxSelectMultiple)
    class Meta:
        model=SomeModel

注意:我正在使用Django 1.1。

答案 2 :(得分:0)

使用piquadrat的答案对我有用,但需要添加一行来定义M2M的查询集。请参阅this link