django模型字段中的ASCII验证器因简单英语而失败

时间:2016-05-12 09:06:44

标签: django python-3.x

我有一个模型,其中包含ascii验证器的以下字段:

def is_ascii(value):
    try:
        value.decode('ascii')
    except:
        raise ValidationError('Please enter all your details in english characters!')


first_name = models.CharField("First Name", max_length=32, blank=False, null=False, validators=[is_ascii])
last_name = models.CharField("Last Name", max_length=32, blank=False, null=False, validators=[is_ascii])
email = models.EmailField("Email", blank=False, null=False, unique=True,
                          error_messages=email_errors, validators=[is_ascii])

它曾经在Python 2上按预期工作,但验证器在Pyhton 3上失败。这里有什么问题?

2 个答案:

答案 0 :(得分:3)

你正在捕捉所有异常,这隐藏了问题所在。 从不,永远这样做。

如果您删除了try / except,则会看到实际错误是什么:

AttributeError: 'str' object has no attribute 'decode'

这是因为在Python 3中,所有字符串都是unicode,并且你不能解码一个unicode字符串,你只能编码它。如果使用了正确的方法,则会得到正确的结果,当字符串包含非ASCII值时,这是UnicodeEncodeError。您应捕获该特定异常。

def is_ascii(value):
    try:
        value.encode('ascii')
    except UnicodeEncodeError:
        raise ValidationError('Please enter all your details in english characters!')

答案 1 :(得分:2)

Django EmailField继承CharField,这是一个最大为max_length的字符串。 Python 3.x中的字符串没有decode方法,但字节确实如此。 您可以使用ASCII正则表达式验证