Django 1.11 Model CharField的多个验证器

时间:2017-11-30 02:24:59

标签: django django-models django-validation

有谁知道是否可以将多个验证器应用于Django 1.11 Model CharField?我正在尝试将字段格式化为:"使用格式XX XXXX XXXX"或"使用格式XXXX XXX XXX"

prefphone = models.CharField(max_length=255,null=True,blank=True,validators=[RegexValidator(r'^[0-9]{2} [0-9]{4} [0-9]{4}$', "Use format XX XXXX XXXX"),RegexValidator(r'^[0-9]{4} [0-9]{3} [0-9]{3}$', "Use format XXXX XXX XXX")])

第一次验证失败,第二次验证未经过测试。

如果有其他方法可以实现我的结果,我将很高兴听到他们的意见。谢谢!

2 个答案:

答案 0 :(得分:1)

这是我接近多个验证器: 定义自定义验证器功能:

from django.core.exceptions import ValidationError

validator_fn = [
    RegexValidator(r'^[0-9]{2} [0-9]{4} [0-9]{4}$', "Use format XX XXXX XXXX"),
    RegexValidator(r'^[0-9]{4} [0-9]{3} [0-9]{3}$', "Use format XXXX XXX XXX")
]

def regex_validators(value):
    err = None
    for validator in validator_fn:
        try:
            validator(value)
            # Valid value, return it
            return value
        except ValidationError as exc:
            err = exc
    # Value match nothing, raise error
    raise err

现在在字段中,只需使用regex_validators作为单个验证器:

prefphone = models.CharField(max_length=255,null=True,blank=True,validators=[regex_validators,])

答案 1 :(得分:1)

如果您需要完成两项验证

def regex_validators(value):

    err = None
    cont = 0

    for validator in validator_fn:
        try:
            validator(value)
            cont+=1
            if cont == 2:
                return value

        except ValidationError as exc:
            err = exc

    raise err