Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 在没有引发验证错误之后,如何仅在表单字段的末尾运行验证程序?_Django_Django Forms - Fatal编程技术网

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