Django MultipleChoiceField选择一个选项时CheckboxSelectMultiple错误
我有一个Django表单,正如标题所说。这个表单里有一组复选框。如果选择了两个或更多的复选框,一切都运作得很好。但如果只选择了一个复选框,我就会收到“错误列表:请输入一个值列表”的提示。
我检查了self.request.POST['key'],发现当我选择多个选项时,列表里有多个相同键(不同值)的条目。而当我只选择一个选项时,列表里只有一个条目(这很合理)。无论是哪种情况,这些条目都是字符串,而不是unicode字符串或列表。
这个错误和MultipleChoiceField有关吗?
代码:
# 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())
更新:
在表单的处理函数中,如果我手动添加第二个条目,那么一切又都正常了。我真的在想MultipleChoiceField是不是要求选择超过1个条目,但我找不到任何相关的文档。如果真是这样,那就没有道理了。
下面的“黑科技”通过添加一个重复的条目来解决这个问题,但这并不是一个可接受的解决方案。
tmpList = self.request.POST.getall('installed_apps')
if len(tmpList) == 1:
self.request.POST.add('installed_apps', tmpList[0])
1 个回答
4
来自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"
引发的,应该提示'请输入一个值的列表.'
这就是你看到的情况。看起来它确实需要一个值的列表,而一个清理过的值并不是一个列表。一个解决办法是,在选项中创建一个额外的空元素,并让它默认被选中,同时在表单中隐藏起来。这样,只要用户至少选择一个元素,提交的数据就会包含两个(一个是用户选择的,另一个是隐藏的),这样就能通过验证。
否则,可能换一个表单元素会更好。
希望这对你有帮助!