Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django ModelForm复选框小部件_Python_Django_Django Models_Django Forms - Fatal编程技术网

Python Django ModelForm复选框小部件

Python Django ModelForm复选框小部件,python,django,django-models,django-forms,Python,Django,Django Models,Django Forms,我现在有一个问题,可能忽略了一些非常琐碎的事情。我的模型中有一个字段,该字段应允许通过复选框表单进行多项选择(它不必是管理员屏幕中的复选框,只需在最终用户将看到的表单区域中)。目前我有如下字段设置: # Type of Media MEDIA_CHOICES = ( ('1', 'Magazine'), ('2', 'Radio Station'), ('3', 'Journal'), ('4', 'TV Station'), ('5', 'Newspap

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

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

在这种情况下,最简单的方法是将选择放在一个单独的模型中,然后使用多个关系。之后,您只需覆盖ModelForm的小部件以供该字段使用,Django将自动执行正确的操作。如果您坚持使用CharField,您可能需要执行以下操作

@二,。注释:您如何覆盖小部件?我就是这样做的,而且它工作得完美无缺:

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

我刚刚开始研究ModelForms中的小部件分配。在我看到的许多示例中,包括Piquard,表单的_uu__; init _;方法被覆盖

我觉得这有点令人困惑,仅仅覆盖所需字段对我来说更自然:

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

注意:我使用的是Django1.1

使用Piquard的答案对我来说很有效,但需要添加一行来定义M2M的查询集。请参阅。

谢谢你的提示。我不想使用ManyToMany,因为我将为始终是静态的信息创建大约6个模型。似乎没有必要。而且,fwiw,这似乎不起作用。当我使用复选框SelectMultiple form时,该字段显示为空。如果我使用multipleechoicefield,以及sorta工作的Checkbox小部件,但前提是我向表单提供一个选项列表。然后,我必须使用重写的clean函数将数据映射回来。也许这是正确的方法,但它“感觉”不对,通常当某件事“感觉”不对时,它就是。我只是想验证一下我在这里没有做得太多。我做得不对,所以谢谢你把我放在这里,但是现在我有了这样一个:in Models.py:media_type=Models.ManyToManyField(MediaChoice)in Forms.py:def uuu init_u(self,*args,**kwargs):super(media contactform,self)。\uu init_uu(*args,**kwargs)self.fields['media\u type'].widget=forms.CheckboxSelectMultiple()如果我把表单的内容转储出去,我就能看到正确的选项。我猜我的模板中一定有错误。某些小部件显示得很好,但这一个不好。还不知道为什么。明白了!非常感谢你的帮助。格式化很简单,但修复方法如下:self.fields['media\u type'].widget=forms.CheckboxSelectMultiple(选项=self.fields['media\u type'].choices)