保存django模型MultipleChoiceField复选框字段

时间:2015-09-25 18:46:56

标签: django django-models django-forms django-admin

我有一个复选框选项字段,如下所示:

models.py
TYPE_CHOICES = (
       ('s', 'small'),
       ('m', 'medium'),
       ('b', 'big'),
     )
class Post(models.Model) :
    size = models.CharField(blank=True,max_length="3", choices=TYPE_CHOICES)

所以在管理员表格中:

class MainContent(forms.ModelForm):
    size = forms.MultipleChoiceField(choices=TYPE_CHOICES, widget=forms.CheckboxSelectMultiple())
    class Meta:
        model = Post
        fields = '__all__'

但是当我保存表单时,它会给我这个错误:

  

选择有效的选择。 [' s'' m',' b']不是可用的   选择。

那么,问题是什么?

更新

我的道歉,这个问题没有给出足够的信息,让我解释一下。

我想要复选框输入的原因是因为我希望它能够在单个字段(一列)中存储多个值。也许数据可以序列化(或以逗号分隔),

由于TYPE_CHOICES是静态的,将来不会更改,我不打算使用ManytoMany。

此外,我希望它能够通过语言轻松地在模板中显示。

希望这很清楚。

2 个答案:

答案 0 :(得分:0)

  

据推测,您希望存储的表中有一列   多个值。这也会迫使你思考如何做   序列化 - 例如,如果你这么做就不能用逗号分隔   需要存储可能包含逗号的字符串。

     

但是,您最好使用如下之一的解决方案:

     

https://pypi.python.org/pypi/django-multiselectfield/

     

https://pypi.python.org/pypi/django-select-multiple-field/

这个答案解决了你的问题,你试着存储一个字符串列表,但是charfield。

Link to post

或尝试使用ChoiceField

答案 1 :(得分:0)

您在模型中使用CharField,但在您的表单中使用MultipleChoiceField,对于ModelForm,它是一种不兼容的类型,因为如果用户选择的不多,它就不知道该怎么做一个选项,我建议使用目录和ManyToManyField:

如果您想为Post模型选择多个尺寸:

models.py

class SizesCatalog(models.Model):
    description = models.CharField(max_length=255)

    def __str__(self):
         return self.description

class Post(models.Model) :
    size = models.ManyToMany(SizesCatalog, db_table='post_sizes')

管理员表单

class MainContent(forms.ModelForm):
    class Meta:
        model = Post
        fields = '__all__'

如果您只想选择一种尺寸:

models.py

class SizesCatalog(models.Model):
    description = models.CharField(max_length=255)

    def __str__(self):
         return self.description

class Post(models.Model) :
    size = models.ManyToMany(SizesCatalog)

管理员表单

class MainContent(forms.ModelForm):
    class Meta:
        model = Post
        fields = '__all__'

这样你就可以让Django处理你的问题了,将来你甚至可以更好地更新你的尺寸