Python Django MultipleChoiceField,带有复选框SelectMultiple error(如果只选择了一项)

Python Django MultipleChoiceField,带有复选框SelectMultiple error(如果只选择了一项),python,django,forms,Python,Django,Forms,我有一个Django表格,如标题所述。它有一组复选框。如果选择了两个或两个以上,一切都会很完美。如果只选择了一项,那么我会得到“errorlist:输入值列表” 我已经检查了self.request.POST['key'],当我选择多个选项时,我注意到列表中包含多个相同键(不同值)的条目。它只包含一个条目和一个选项(有意义)。无论哪种情况,这些条目都是字符串,而不是unicode字符串或列表 此错误是否与MultipleEchoIceField有关 代码: 更新: 在表单的post处理程序中,如

我有一个Django表格,如标题所述。它有一组复选框。如果选择了两个或两个以上,一切都会很完美。如果只选择了一项,那么我会得到“errorlist:输入值列表”

我已经检查了self.request.POST['key'],当我选择多个选项时,我注意到列表中包含多个相同键(不同值)的条目。它只包含一个条目和一个选项(有意义)。无论哪种情况,这些条目都是字符串,而不是unicode字符串或列表

此错误是否与MultipleEchoIceField有关

代码:

更新:

在表单的post处理程序中,如果手动添加第二项,则所有项都会再次工作。我真的认为MultipleChiceField要求>1项,但我在任何地方都找不到记录在案的内容,如果它这样做,那就没有意义了

下面的“hack”通过添加一个重复项来修复它,但是这不是一个可接受的解决方案

 tmpList = self.request.POST.getall('installed_apps')
 if len(tmpList) == 1:
         self.request.POST.add('installed_apps', tmpList[0])

从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”
指示的错误,该错误应该是
“输入值列表”。
这就是您看到的。看起来它实际上期望一个值列表,而一个清除的值不是一个列表。一种尝试是在选项中创建一个额外的空白元素,并在默认情况下将其选中并隐藏在表单中。这样,只要他们选择至少一个元素,帖子将包含两个元素(选中的和隐藏的),并将进行验证

否则,您最好选择另一个表单元素


希望这有帮助

你能发布你用来创建这个MultipleChiiceField的代码吗?它是否为您的错误提供了行号?您的实现似乎试图对列表执行某些操作,但由于multipleechoicefield规范化为unicode对象,因此很容易丢失包含一个或零个对象的列表。另外,请确保您正在规格化的对象实际上可以规格化为unicode对象。您处理一个结果与处理多个结果不同吗?我添加了一些代码。仅使用1项调试表单数据。我在request.POST数据中看到了1项,它是u'some_string'。我也在Form类的数据字段中看到它,u'some_string'。如果我加上两个值,它们仍然是u'some_string'和u'other_string'。因此,我无法区分一个或两个条目之间的区别。你是对的,尽管我们把它当作一个列表。仅表单.is_valid()失败,只有1项。我将multipleChiceField子类化,并修复了其to_python方法,以捕获此案例并将其他案例传递给super方法。这似乎运作良好。谢谢
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')