我有一个模型,其中包含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上失败。这里有什么问题?
答案 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正则表达式验证