我的模型中定义了一个字段 -
languages = models.CharField(max_length = 30, choices=LANGUAGE_CHOICES, blank = True, null = True)
选择很简单 -
LANGUAGE_CHOICES = (
('English', 'English'),
)
我在这个模型上定义了一个ModelForm并覆盖了字段 -
languages = forms.MultipleChoiceField(choices=LANGUAGE_CHOICES, widget=forms.SelectMultiple)
当我填写表格时,选择“英语”,然后尝试提交,我收到错误 -
语言
价值u“[u'English']”不是一个有效的选择
有什么基本的我做错了吗?或者,MultipleChoiceField与SelectMultiple小部件结合起来不是一种方法吗?
另外,有没有理由为什么选择元组不能两次具有相同的值,就像我现在拥有的那样('英语','英语')?
以下是一些可能有助于深入了解
的其他代码模板代码:
<div class="abovepad">
<label for="id_languages">Languages:</label>
{{form.languages}}
</div>
包含语言的POST数据部分:
u'languages': [u'English'],
ModelForm代码的相关片段:
class ProfileForm(forms.ModelForm):
languages = forms.MultipleChoiceField(choices=LANGUAGE_CHOICES)
class Meta:
model = Student
如你所见,我几乎没有定制任何东西。在我遇到这个问题的过去,我会切换到列表中的项目为模型,然后使用ManyToMany字段,这不会导致相同的问题。对于那些情况,让项目成为模型是有意义的;在这种情况下它没有。我只是想知道我做错了什么,或者这个组合是不是应该工作。如果没有真正的答案,那么我的另一个选择就是尝试挖掘Django表单代码,看看它为什么要这样做。
答案 0 :(得分:8)
您必须从模型 定义中删除choices=LANGUAGE_CHOICES
:
您的表单返回的是所选值的列表,这在您的models.LANGUAGE_CHOICES
答案 1 :(得分:1)
错误消息表明,languages
不包含数组,而是包含一个包含该数组表示的unicode字符串。 languages
应评估为[u'English']
(数组),而是评估为u"[u'English']"
(unicode字符串)。
您的ModelForm是否包含可能正在更改clean_languages
的值的任何自定义验证(例如,languages
函数)?
BTW:SelectMultiple
已经是MultipleChoiceField
的默认小部件,因此无需指定小部件。
有助于找到原因的一些事情:
POST
数据
答案 2 :(得分:1)
我现在已经知道这一年了,但是认为尝试回答可能仍然有帮助。
我认为这里可能存在一些问题,但手头的主要问题是ModelForm期望数据库记录的密钥不是字符串值。
如果您要制作与您的数据库无关的表单,我建议您创建一个Form而不是ModelForm。但是如果你想与数据库交互,那么使用ModelForm并在Student模型中定义一个ForeignKey以与语言表相关联,让ModelForm为你工作。
基于我对模型的假设的示例应用程序。
your_project/example_app/models.py:
from django.db import models
class Student(models.Model):
name = models.CharField(max_length=255)
language = models.ForeignKey('Language')
class Language(models.Model):
name = models.CharField(max_length=255)
your_project/example_app/forms.py:
from django.forms import ModelForm
from example.models import Student
class StudentForm(ModelForm):
class Meta:
model = Student
相关文档:https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#modelform
片段:
正如您所料,ForeignKey和ManyToManyField模型字段类型是特殊情况:
ForeignKey由
django.forms.ModelChoiceField
表示,它是ChoiceField,其选择是模型QuerySet。 ManyToManyField由django.forms.ModelMultipleChoiceField
表示,它是一个MultipleChoiceField,其选择是一个模型QuerySet。