0

对于电话号码自定义验证,我有以下实现。它正确地进行了验证,但返回的值(格式化)没有保存在模型实例中。我不使用自定义表单,数据是从管理面板输入的。

自定义验证器

def phone_number_validator(value):
    if value:
        value = value.strip()
        value = value.replace(' ', '')

        digits = []
        non_digits = []
        for c in value:
            if c.isdigit():
                digits.append(c)
            else:
                non_digits.append(c)

        if len(non_digits):
            raise ValidationError('Only numbers and spaces are allowed for this field.')
        elif len(digits) < 10 or len(digits) > 10:
            raise ValidationError('Phone number should be exactly 10 digits.')
        elif (not value.startswith('07')) and (not value.startswith('0')):
            raise ValidationError('Invalid phone number.')

        if value.startswith('07'):  # mobile number
            value = f'{value[0:3]} {value[3:6]} {value[6:]}'
        elif value.startswith('0'):  # landline
            value = f'{value[0:3]} {value[3:4]} {value[4:7]} {value[7:]}'
        print(value) #### here the correct format is displayed
        return value

模型.py

hotline = models.CharField(max_length=PHONE_NUMBER_LENGTH, validators=[phone_number_validator])
4

2 回答 2

0

验证器的目的只是根据一组标准检查值。它并不意味着修改价值。

参考:https ://docs.djangoproject.com/en/4.0/ref/validators/

于 2022-02-13T09:06:14.253 回答
0

这已经在这里得到了回答(以及来自docs)。

如果你想使用validate_or_process-function,我在我自己的问题中有一个方法

于 2022-02-13T08:58:52.783 回答