Django表单错误“为ManyToMany字段输入值列表”

时间:2013-09-12 19:15:37

标签: django

在验证ManyToMany字段时,我收到“输入值列表”错误。 这是我的代码

models.py

class Poll(models.Model):
    title = models.CharField(max_length=200)
    category = models.ManyToManyField("PollCategory")    

forms.py

class PollForm(forms.ModelForm):
        created_by = forms.CharField(required=False, max_length=50)
        class Meta:
            model = Poll
            widgets = {
                'category': Select(),
            }

模板

<form action="{% url add_poll %}"  method="post">{% csrf_token %}
         title : {{ form.title }} <br>
         category : {{ form.category }}</div>
        <input type="submit" value="Submit"/>
</form>

执行 form.is_valid()时出现此错误。这可能是因为从模板我传递的是“字符串”,它将是select选项的值,但在ManyToMany字段中,它需要保存应该是整数的“id”。

我已经在网上搜索了上述问题的解决方案,但找不到适合我情况的方法。

如何在Poll模型中成功验证并保存“类别”字段?

1 个答案:

答案 0 :(得分:0)

  

这可能是因为从模板i传递了“string”,它将是select选项的值,但在ManyToMany字段中,需要保存应该是整数的“id”。

你很亲密。它期待一个列表,而不是一个字符串。以下是to_python的方法MultipleChoiceField

def to_python(self, value):
    if not value:
        return []
    elif not isinstance(value, (list, tuple)):
        raise ValidationError(self.error_messages['invalid_list'])
    return [smart_unicode(val) for val in value]

现在知道您需要一个列表,您可以尝试继承MultipleChoiceField并提供自己的to_python

class SingleMultipleChoiceField(MultipleChoiceField):
    widget = Select

    def to_python(self, value):
        if not value:
            return []
        return [value]

    def validate(self, value):
        if self.required and not value:
            raise ValidationError(self.error_messages['required'])
        if not self.valid_value(value):
            raise ValidationError(self.error_messages['invalid_choice'] % {'value': value})

我没有测试过这个,但试一试。或者,理想情况下,只使用标准小部件而不是Select小部件,这整个问题就消失了。我不确定你为什么只想把一个元素强加到ManyToManyField;它们是为多个对象构建的。