如果只选择了一个项目,Django MultipleChoiceField与CheckboxSelectMultiple错误

时间:2014-06-23 21:50:57

标签: python django forms

我有一个标题中描述的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])

1 个答案:

答案 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将包含两个(选择和隐藏),并将验证。

否则,也许不同的表单元素是您最好的选择。

希望这有帮助!