2016-05-12 73 views
0

我有具有以下与ascii验证领域的典范: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

的Django EmailField继承CharField它是一个字符串,最多MAX_LENGTH。 Python 3.x中的字符串没有decode方法,但字节可以。 您可以使用ASCII正则表达式验证代替

+0

谢谢!我不应该使用泛型除外。 –

3

您正在捕捉所有例外情况,从而隐藏了问题所在。 从来没有,做到这一点。

如果您移除try /除外,你会看到什么实际错误是:

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!') 
+0

您的建议是正确的,它会给我在那边的确切问题。但这不会解决它,因为它是一个属性错误。谢谢! –

+0

我将使用正则表达式验证。 –