我有一个复选框选项字段,如下所示:
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。
此外,我希望它能够通过语言轻松地在模板中显示。
希望这很清楚。
答案 0 :(得分:0)
据推测,您希望存储的表中有一列 多个值。这也会迫使你思考如何做 序列化 - 例如,如果你这么做就不能用逗号分隔 需要存储可能包含逗号的字符串。
但是,您最好使用如下之一的解决方案:
这个答案解决了你的问题,你试着存储一个字符串列表,但是charfield。
或尝试使用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处理你的问题了,将来你甚至可以更好地更新你的尺寸