Django MultipleChoiceField选择一个选项时CheckboxSelectMultiple错误

1 投票
1 回答
2369 浏览
提问于 2025-04-18 10:49

我有一个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"引发的,应该提示'请输入一个值的列表.' 这就是你看到的情况。看起来它确实需要一个值的列表,而一个清理过的值并不是一个列表。一个解决办法是,在选项中创建一个额外的空元素,并让它默认被选中,同时在表单中隐藏起来。这样,只要用户至少选择一个元素,提交的数据就会包含两个(一个是用户选择的,另一个是隐藏的),这样就能通过验证。

否则,可能换一个表单元素会更好。

希望这对你有帮助!

撰写回答