我目前有一个问题,可能会忽略一些非常微不足道的事情。我的模型中有一个字段,应该允许通过复选框表单进行多项选择(它不必是管理屏幕中的复选框,只是在最终用户将看到的表单区域中)。目前我的字段设置如下:
# 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我很乐意接受文档链接作为答案,因为看起来我只是在掩饰明显的东西。
答案 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。