Django 在没有引发验证错误之后,如何仅在表单字段的末尾运行验证程序?
我只想在需要、最小和最大验证以及自定义的Django 在没有引发验证错误之后,如何仅在表单字段的末尾运行验证程序?,django,django-forms,Django,Django Forms,我只想在需要、最小和最大验证以及自定义的is\u digit()验证运行时运行特定的校验和验证 原因是如果其他验证失败,我不想显示校验和验证的错误消息 我试过: id_number = ZaIdField( required=False, max_length=13, min_length=13, validators=[validate_numeric, ] ) 然后,在其他人在super()中运行校验和验证器之后,我就有了校验和验证器: 更新: 换句话说,我
is\u digit()
验证运行时运行特定的校验和验证
原因是如果其他验证失败,我不想显示校验和验证的错误消息
我试过:
id_number = ZaIdField(
required=False,
max_length=13,
min_length=13,
validators=[validate_numeric, ]
)
然后,在其他人在super()
中运行校验和验证器之后,我就有了校验和验证器:
更新:
换句话说,我的最终验证取决于长度是否正确以及所有数字。
因此,我只想在运行它之前确保它是正确的。有关详细信息,请查看。其实很简单
def clean_id_number(self):
data = self.cleaned_data['id_number']
if checksum:
raise forms.ValidationError("Checksum error!")
return data
有关更多信息,请查看。其实很简单
def clean_id_number(self):
data = self.cleaned_data['id_number']
if checksum:
raise forms.ValidationError("Checksum error!")
return data
如果您想扰乱验证器的顺序,我将重写
ZaIdFields
方法
请注意,要覆盖的字段validate
方法将始终为
示例(未测试):
如果您想扰乱验证器的顺序,我将重写
ZaIdFields
方法
请注意,要覆盖的字段validate
方法将始终为
示例(未测试):
这可能已经在以前的某个地方得到了回答,但看起来应该在表单的
clean()
:
该计划的关键部分是:
在调用表单的clean()方法时,所有
现场清理方法已经运行(前两部分),因此
self.cleaned_数据将填充到所有保存至今的数据中
远
因此,您只需检查该字段是否已保存,如果已保存,则它已通过先前的验证这可能在以前的某个地方得到了回答,但看起来执行此操作的正确位置是表单的
clean()
:
该计划的关键部分是:
在调用表单的clean()方法时,所有
现场清理方法已经运行(前两部分),因此
self.cleaned_数据将填充到所有保存至今的数据中
远
因此,您只需检查字段是否已存活,如果已存活,则它已通过先前的验证好的,这样它将在最后运行,但它仍在运行,从我的测试中。如果有错误,我怎么能不运行它呢?好的,这使得它最后运行,但它仍然运行,从我的测试。如果有错误,我怎么能不运行它?
class ZaIdField(forms.CharField):
'''
Field for validating ZA Id Numbers
'''
def run_validators(self, value):
super().run_validators(value) # will potentially throw ValidationError, exiting
validate_sa_id(value) # your late validator, will throw its own ValidationError
def clean(self):
cleaned_data = super().clean()
id_num = cleaned_data.get('id_number')
if id_num:
validate_sa_id(id_num)
return cleaned_data