在没有引发验证错误之后,您如何仅在表单字段上运行验证器?

问题描述 投票:1回答:3

我想只运行特定的校验和验证,如果运行所需的,最小和最大验证以及自定义is_digit()验证。

原因是如果某些其他验证失败,我不想显示校验和验证的错误消息。

我试过了:

id_number = ZaIdField(
    required=False,
    max_length=13,
    min_length=13,
    validators=[validate_numeric, ]
)

然后我有其他人在super()运行后的校验和验证器:

class ZaIdField(forms.CharField):
    '''
    Field for validating ZA Id Numbers
    '''
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def validate(self, value):
        """Check if id is valid"""
        # Use the parent's handling of required fields, etc.
        super().validate(value)
        validate_sa_id(value)

更新:

换句话说,我的最终验证取决于正确的长度和所有数字。所以我只想在运行它之前确保它是正确的。

django django-forms
3个回答
0
投票

查看django docs以获取更多信息。实际上它非常简单。

def clean_id_number(self):
    data = self.cleaned_data['id_number']

    if checksum:
        raise forms.ValidationError("Checksum error!")

    return data

0
投票

这可能已经在某个地方得到了回答,但看起来正确的地方是以qazxsw poi的形式:

clean()

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 的关键部分是:

当调用表单的clean()方法时,将运行所有单独的字段清理方法(前两个部分),因此self.cleaned_data将填充到目前为止幸存的任何数据。

因此,您只需检查该字段是否已存活,如果已存在则已通过先前的验证


0
投票

如果你想弄乱验证器的顺序,我会覆盖docsZaIdFields方法。

请注意,您重写的字段run_validators方法将始终为validate

示例(未经测试):

called before
© www.soinside.com 2019 - 2024. All rights reserved.