在验证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模型中成功验证并保存“类别”字段?
答案 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
;它们是为多个对象构建的。