2011-07-19 138 views
3

我需要用一组复选框和一个“其他”[请指定]选项来填充一个CharField(值将是'option-a ,其他'为下面的表单状态)。形式可以基本上是这样的:实现一个复选框(复选框)在Django中选择+“其他”小部件

[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 
) 

这正确呈现形式,和我的自定义清洁()方法被调用,但是当我保存的形式,我得到验证错误:

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

我已经玩过了添加自定义验证器,但迄今为止没有任何区别。缺少什么?

+0

有一篇文章可能会帮助你修复类似的东西。该文章的主要变化是为另一个小部件创建子类。 [文章。](http://garmoncheg.blogspot.com/2014/05/implementing-multiple-radio-select.html) – garmoncheg

回答

0

您可能需要重写您的类上的Validate方法。在https://code.djangoproject.com/browser/django/trunk/django/forms/fields.py#L682的代码中,您会看到它引发错误消息的位置。

+0

我没有覆盖validate()和valid_value():https://gist.github。 com/3327b22ecdc0f8abca8f但我仍然收到验证错误。有没有办法快捷的进行其他验证? –

+1

通过代码挖掘。您收到的错误消息不会出现在代码中。另一个班级以某种方式捕捉它吗?您可能想要捕获验证错误并转储追溯,以便您可以确切地看到它来自哪里。 – emperorcezar

1

因为一旦你保存模型实例的表格中,检查该错误只发生“价值u'education,其他”不是一个有效的选择”错误是从模型未来的形式确认,而不是验证。如果您在模型字段中设置了choices,那么您确实想要在其中存储自由格式的字符串时会发生这种情况。

相关问题