【问题标题】:Error saving django model MultipleChoiceField checkbox field保存 django 模型 MultipleChoiceField 复选框字段时出错
【发布时间】:2015-09-25 18:46:55
【问题描述】:

我有一个这样的复选框选择字段:

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。

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

希望这足够清楚。

【问题讨论】:

  • 您的设置听起来很奇怪。你的模型有sizeCharField,但是你的Form 你怎么用MultipleChoiceField
  • 我认为您传递了一个列表,而不是“s”、“m”或“b”。你不能保存所有。只有一个。
  • @ShangWang 是对的,这就是问题所在。
  • 您想在一个Post 上设置多个尺寸还是只选择一个size

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


【解决方案1】:

大概,您希望表中的单个列正在存储 多个值。这也会迫使你思考如何将 序列化 - 例如,如果你不能简单地用逗号分隔 需要存储可能包含逗号的字符串。

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

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

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

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

Link to post

或尝试使用ChoiceField

【讨论】:

    【解决方案2】:

    您在模型中使用 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 处理您的问题,并且在未来您甚至可以以更好的方式更新您的尺寸

    【讨论】:

      猜你喜欢
      • 2021-12-03
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 2012-05-29
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      相关资源
      最近更新 更多