我的表单中有一个多选字段,用户可以在其中获得字段列表,并且最多可以选择三个选项。我已经定义了一个自定义验证器来限制用户选择三个以上的字段。
forms.py
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
消息始终被用户抛出,即使所选字段为三个或少于三个。
验证器功能似乎有什么问题?
答案 0 :(得分:1)
我的猜测是CheckboxSelectMultiple
value_from_datadict
方法返回的值是列表[u'abc', u'xyz']
。然后通过字段[u'abc', u'xyz']
方法将其转换为字符串to_python
(实际上,它是u"[u'abc', u'xyz']"
)。验证器运行后。这个字符串的长度超过3,这就是你ValidationError
的原因。
您应该使用ManyToManyField
。
答案 1 :(得分:0)
我的验证器没有按预期工作的原因是因为传递给验证器的参数,比如[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")