表单验证已撤消

时间:2017-01-28 16:17:09

标签: django django-forms

Django版本1.10.5

我在文档或代码源中找不到这个答案。使用下面的示例表单,我希望我提交的表单验证按照我定义的顺序运行。

所以validators.RegexValidator,validators.MinLengthValidator等......将按此顺序运行。但是,在提交表单时,似乎验证器的运行顺序相反。

其中validate_status,validate_employee_id等将运行。

这是预期的吗?

class FormLogin(forms.Form):
    # Employee ID
    employee_id = forms.CharField(
        label=_('employeeId'),
        required=True,
        widget=forms.TextInput(
            attrs={
                'id': 'employee_id',
                'placeholder': _('employeeId'),
                'class': 'form-control'
            }
        ),
        validators=[
            validators.RegexValidator('^[1-9][0-9]*$', _('validatorStartsWithZero'))
            validators.MinLengthValidator(1),
            validators.MaxLengthValidator(20),
            validate_employee_id,
            validate_status
        ]
    )

目前我有1位ID为1的用户。

当我使用01提交表单时,validate_status验证器接管并返回用户甚至不存在的情况。我本来期望首先返回validators.RegexValidator,因为它前面有一个0。

如果我颠倒了验证器的整个顺序,那么验证似乎按我想要的顺序工作。但现在代码可读性并不清楚实际发生的情况。

修改1 有更多信息的已清理示例

1 个答案:

答案 0 :(得分:1)

我写了这个小测试代码来重现这个。

from django import forms


def validate_1(value):
    print('RUNNING VALIDATOR 1')
    raise ValidationError(
        'validation error 1',
        params={'value': value},
    )

def validate_2(value):
    print('RUNNING VALIDATOR 2')
    raise ValidationError(
        'validation error 2',
        params={'value': value},
    )


class FormLogin(forms.Form):
    # Employee ID
    employee_id = forms.CharField(validators=[
        validate_1,
        validate_2
    ])

运行它:

>>> f = FormLogin({'employee_id': '01'})
>>> f.is_valid()
RUNNING VALIDATOR 1
RUNNING VALIDATOR 2
False
>>> f.errors
{'employee_id': ['validation error 1', 'validation error 2']}
>>> 

如您所见,验证器按降序执行。

我认为你自己编写的一个验证器没有正确抛出ValidationError,这样就会使错误列表搞砸,或者你没有正确地渲染模板中的错误。

通常,所有验证程序都将运行,并且每个验证错误都将附加到错误列表中。但它们按降序排列。