我有一个标题中描述的Django表单。它有一组复选框。如果选择两个或更多,一切都很完美。如果只选择了一个项目,那么我得到"错误列表:输入值列表。"
我检查了self.request.POST [' key']并且我注意到当我选择多个选项时,列表包含相同键(不同值)的多个条目。它只包含一个带有一个选项的条目(有意义)。在任何一种情况下,这些条目都是字符串,而不是unicode字符串或列表。
此错误与MultipleChoiceField有关吗?
CODE:
# getAllChoices() returns a List([u'key', u'value'], ...)
class TestModelForm(forms.Form):
choices = MultipleChoiceField(label='Test Choices',
choices=getAllChoices(),
help_text="Testing help text",
required=False,
widget=CheckboxSelectMultiple())
更新:
在表单的post处理程序中,如果我手动添加第二个项目,那么所有工作都会再次运行。我真的认为MultipleChoiceField要求> 1项,但我无法在任何地方找到这个记录,如果这样做没有任何意义。
以下' hack'通过附加一个重复项来修复它,但这不是一个可接受的解决方案。
tmpList = self.request.POST.getall('installed_apps')
if len(tmpList) == 1:
self.request.POST.add('installed_apps', tmpList[0])
答案 0 :(得分:2)
来自Django源代码:
def clean(self, value):
if self.required and not value:
raise ValidationError(self.error_messages['required'], code='required')
elif not self.required and not value:
return self.queryset.none()
#This line is your culprit
if not isinstance(value, (list, tuple)):
raise ValidationError(self.error_messages['list'], code='list')
这会引发"list"
指示的错误,应该说'Enter a list of values.'
这就是您所看到的。事实上它确实需要一个值列表,而一个清理后的值不是列表。一种尝试是在选项中创建一个额外的空白元素,并默认选中它,并隐藏在表单中。这样,只要他们选择至少一个元素,POST将包含两个(选择和隐藏),并将验证。
否则,也许不同的表单元素是您最好的选择。
希望这有帮助!