[英]Django: Validator for a multiple choice form field
我在表单中有一个多选字段,其中为用户提供了一个字段列表,他们最多可以选择三个选项。 我定义了一个自定义验证器,用于限制用户选择三个以上的字段。
表格
class EvangelizedForm(forms.ModelForm):
area_of_interest = forms.CharField(
max_length=1230,
widget=forms.CheckboxSelectMultiple(
choices=Evangelized.AREA_CHOICES),
help_text="Areas of interest(Upto 3)")
我在models.py中定义了一个名为len_area
的自定义表单验证器,如下所示:
def len_area(li):
if len(li) > 3:
raise ValidationError("Please select a maximum of three fields only")
models.py
class Evangelized(models.Model):
AREA_CHOICES = (
('Govt', 'Govt'),
('Entertainment', 'Entertainment'),
('Automobile', 'Automobile'),
('Careers', 'Careers'),
('Books','Books'),
('Family', 'Family'),
('Food', 'Food'),
('Gaming', 'Gaming'),
('Beauty', 'Beauty'),
('Sports','Sports'),
('Events', 'Events'),
('Business', 'Business'),
('Travel', 'Travel'),
('Health', 'Health'),
('Technology','Technology'),
)
area_of_interest = models.CharField(
max_length=1280,
validators=[len_area])
但是, ValidationError
消息始终会向用户抛出,即,即使所选字段为三个或小于三个也是如此。
我的验证器功能似乎出了什么问题?
我的猜测是, CheckboxSelectMultiple
的value_from_datadict
方法返回的值是列表[u'abc', u'xyz']
。 然后通过字段的to_python
方法将其转换为字符串[u'abc', u'xyz']
(实际上,它是u"[u'abc', u'xyz']"
)。 验证器运行之后。 该字符串的长度大于3,这就是为什么收到ValidationError
的原因。
您应该使用ManyToManyField
。
我的验证器未按预期工作的原因是因为传递给验证器的参数说[u'abc', u'xyz']
是一个字符串,而不是我在定义验证器时曾想过的列表。 结果,正如@ f43d65正确指出的那样,参数的长度每次都超过3,因此引发了ValidationError
。
为了使验证器按预期工作,我在验证器中进行了以下更改:
def len_area(li):
if li.count("u'") > 3:
raise ValidationError("Please select a maximum of three fields only")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.