Django ModelForm CheckBox小部件

f4n*_*4nt 2 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)
Run Code Online (Sandbox Code Playgroud)

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

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

Ben*_*end 15

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

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

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

  • 得到它了!非常感谢你的帮助.格式是gunna软件,但是这里是修复:self.fields ['media_type'].widget = forms.CheckboxSelectMultiple(choices = self.fields ['media_type'].choices) (7认同)
  • 此外,fwiw,似乎没有用.当我使用CheckBoxSelectMultiple表单时,该字段呈现空白.如果我使用MultipleChoiceField,使用sorta工作的Checkbox小部件,但前提是我为表单提供了一个选项列表.然后我必须使用覆盖清理功能将数据映射回来.也许这是正确的方式,但它"感觉"错了,通常当某些"感觉"错误时,它就是.只是想验证我在这里不是太过分了. (2认同)