gpt4 book ai didi

django - 表单验证反转

转载 作者:行者123 更新时间:2023-12-01 17:43:17 26 4
gpt4 key购买 nike

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 使用更多信息清理示例

最佳答案

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

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,因此错误列表变得困惑,或者您没有在模板中正确呈现错误。

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

关于django - 表单验证反转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41911977/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com