Die*_*uzi 5 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
]
)
Run Code Online (Sandbox Code Playgroud)
目前我有1个ID为1的用户.
当我使用01提交表单时,validate_status验证器将接管并返回用户甚至不存在的情况.我本来期望首先返回validators.RegexValidator,因为它前面有一个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
])
Run Code Online (Sandbox Code Playgroud)
运行它:
>>> 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']}
>>>
Run Code Online (Sandbox Code Playgroud)
如您所见,验证器按降序执行。
我假设您自己编写的验证器之一没有正确抛出 a ValidationError,因此错误列表变得混乱,或者您没有在模板中正确呈现错误。
通常,所有验证器都会运行,并且每个验证错误都会附加到错误列表中。但它们按降序运行。
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |