Django:多选表单字段的验证器

时间:2015-07-21 23:02:36

标签: python django forms validation python-2.7

我的表单中有一个多选字段,用户可以在其中获得字段列表,并且最多可以选择三个选项。我已经定义了一个自定义验证器来限制用户选择三个以上的字段。

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消息始终被用户抛出,即使所选字段为三个或少于三个。

验证器功能似乎有什么问题?

2 个答案:

答案 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")