【问题标题】:Django: Validator for a multiple choice form fieldDjango:多选表单字段的验证器
【发布时间】:2015-10-11 14:51:04
【问题描述】:

我的表单中有一个多项选择字段,其中为用户提供了一个字段列表,他们最多可以选择三个选项。我已经定义了一个自定义验证器来限制用户选择三个以上的字段。

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

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

【问题讨论】:

  • 尝试为你的验证器打印参数,我感觉你会在那里找到问题:)
  • 要使用CheckboxSelectMultipleField,您可能想使用forms.MultipleChoiceField 顺便说一句,我认为CharField 不能正常工作
  • @Wolph 我尝试打印参数。所以当用户选择两个字段时,那么传递给验证器的参数是[u'abc', u'xyz'],其长度为2。因此,验证器不应该在这种情况下工作并且不抛出ValidationError吗?
  • 是的...似乎确实有效。真的没有意义,你确定你看的是正确的ValidationError吗?
  • @Wolph 我尝试打印传递的每个参数的长度,奇怪的是,传递的参数是[u'abc', u'xyz'] 中的字符总数,而不是传递内部元素总数的长度列表。

标签: python django forms validation python-2.7


【解决方案1】:

我的猜测是CheckboxSelectMultiplevalue_from_datadict 方法返回的值是列表[u'abc', u'xyz']。然后通过字段的to_python方法转换成字符串[u'abc', u'xyz'](其实就是u"[u'abc', u'xyz']")。验证器运行后。这个字符串的长度超过 3,这就是你得到ValidationError的原因。

你应该使用ManyToManyField

【讨论】:

    【解决方案2】:

    我的验证器没有按预期工作的原因是传递给验证器的参数,比如[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")
    

    【讨论】:

    • 字符串,将存储在模型中,在这种情况下将是[u'abc', u'xyz']
    • 恕我直言,这是一个糟糕的解决方案,如果您以某种方式有一个以 u 结尾的单词,它将被计算两次。假设您无论如何都希望将所有内容存储为逗号分隔的列表,为什么不修改clean_area_of_interest 方法?
    • @Wolph 我同意。在这种情况下,可能不是最好的解决方案。我现在将研究修改clean_area_of_interest 方法。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2016-04-08
    • 2019-03-13
    • 1970-01-01
    相关资源
    最近更新 更多