Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中实现多(复选框)选择+“其他”小部件_Python_Django_Forms_Validation_Modelform - Fatal编程技术网

Python 在Django中实现多(复选框)选择+“其他”小部件

Python 在Django中实现多(复选框)选择+“其他”小部件,python,django,forms,validation,modelform,Python,Django,Forms,Validation,Modelform,我需要用一组复选框加上另一个[请指定]选项的结果填充CharField。对于下面的表单状态,该值将为“option-a,other”。表单基本上可以如下所示: [x] option a [ ] option b [x] other If you selected "other", please specify. [__________] 通过实现MultipleChoiceField的一个子类,我成功地实现了这一点: class CommaStringMultipleChoiceField(

我需要用一组复选框加上另一个[请指定]选项的结果填充CharField。对于下面的表单状态,该值将为“option-a,other”。表单基本上可以如下所示:

[x] option a
[ ] option b
[x] other

If you selected "other", please specify. [__________]
通过实现MultipleChoiceField的一个子类,我成功地实现了这一点:

class CommaStringMultipleChoiceField(MultipleChoiceField):
    def to_python(self, value):
        return [val.rstrip().lstrip() for val in value.split(',')]

    def clean(self, value):
        return ",".join([val.rstrip().lstrip() for val in value])
在我的表单类中,我将该字段指定给我的表单字段:

TYPE_CHOICES = [
    (u'option-a',u"Option A"),
    (u'option-b',u"Option B"),
    (u'other', u"Other"),
]

type = CommaStringMultipleChoiceField(
    choices=TYPE_CHOICES,
    widget=CheckboxSelectMultiple
)
这将正确呈现表单,并调用我的自定义clean方法,但当我保存表单时,会出现验证错误:

Value u'education,other' is not a valid choice.

我已经尝试过添加一个自定义验证器,但到目前为止还没有任何区别。我缺少什么?

您可能需要重写类上的Validate方法。在的代码中,您将看到它在何处引发错误消息。

由于只有在将模型实例保存到表单外时才会发生错误,请检查“值u”education,other“不是有效选项”错误是否来自模型验证而不是表单验证。如果您确实希望在模型字段中存储自由格式的字符串,并且在模型字段中设置了选项,则可能会发生这种情况。

我确实覆盖了validate和valid\u值:但仍然会收到验证错误。有没有一种方法可以简化任何其他验证?通过代码挖掘。您收到的错误消息没有以这种方式出现在代码中。另一个班级不知怎的抓住了它吗?您可能希望捕获验证错误并转储回溯,以便能够准确地看到它的来源。有一篇文章可能会帮助您修复类似的问题。这篇文章的主要变化是对另一个小部件进行子类化。