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 有更多信息的已清理示例
答案 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
,这样就会使错误列表搞砸,或者你没有正确地渲染模板中的错误。
通常,所有验证程序都将运行,并且每个验证错误都将附加到错误列表中。但它们按降序排列。