具有SelectMultiple小部件的MultipleChoiceField“值[...]不是有效选择。”

时间:2010-11-16 21:12:35

标签: django forms select django-models field

我的模型中定义了一个字段 -

    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表单代码,看看它为什么要这样做。

3 个答案:

答案 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数据
  • 用于ModelForm类的代码

答案 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。