1

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

模型.py

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

表格.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()时出现此错误。这可能是因为我从模板中传递了“字符串”,这将是选择选项的值,但在 ManyToMany 字段中,需要保存应该是整数的“id”。

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

如何成功验证并保存投票模型中的“类别”字段?

4

1 回答 1

1

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

你很近。它需要一个列表,而不是单个字符串。以下to_pythonMultipleChoiceField.

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; 它们是为多个对象构建的。

于 2013-09-13T00:15:50.987 回答