【问题标题】:Django ModelForm CheckBox WidgetDjango ModelForm CheckBox 小部件
【发布时间】:2009-08-12 19:26:34
【问题描述】:

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

# 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 我很乐意接受文档链接作为答案,因为我似乎只是在掩盖一些显而易见的事情。

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案1】:

    在这种情况下,最简单的方法是将选项放入单独的模型中,然后使用 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()
    

    【讨论】:

    • 感谢您的提示。不想使用 ManyToMany,因为我将创建大约 6 个模型来获取始终是静态的信息。似乎没有必要。
    • 另外,fwiw,这似乎不起作用。当我使用 CheckBoxSelectMultiple 表单时,该字段呈现空白。如果我使用 MultipleChoiceField 和 Checkbox 小部件,它可以正常工作,但前提是我为表单提供了一个选项列表。然后我必须使用覆盖的清理函数将数据映射回来。也许这是正确的方法,但它“感觉”错了,通常当“感觉”有问题时,它就是。只是想验证我在这里没有做得过火。
    • 好吧,我做得不对,所以感谢您让我直截了当,但是现在我有了这个:在 Models.py 中:media_type = models.ManyToManyField(MediaChoice) 在 Forms.py 中:def __init__(self, *args, **kwargs): super(MediaContactForm, self).__init__(*args, **kwargs) self.fields['media_type'].widget = forms.CheckboxSelectMultiple()
    • 好吧,如果我转储表单的内容,我可以看到正确显示的选项。我猜我的模板一定有问题。某些小部件显示良好,但这个没有。还不知道为什么。
    • 知道了!非常感谢你的帮助。格式化很麻烦,但解决方法是:self.fields['media_type'].widget = forms.CheckboxSelectMultiple(choices=self.fields['media_type'].choices)
    【解决方案2】:

    我刚刚开始研究使用 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。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-04-10
        • 1970-01-01
        • 1970-01-01
        • 2012-02-14
        • 2018-09-01
        • 2018-05-11
        • 2017-11-22
        • 2011-03-28
        • 2020-03-20
        相关资源
        最近更新 更多