Django EmailValidator 验证尾随点

Django EmailValidator validating trailing dots

我使用的是 Django 1.9,EmailValidator 似乎在验证电子邮件 ID 中的尾随点。

faulty_email = 'sid@h.in.'

user.email = faulty_email
user.save()

上面的代码 运行 即使 email 是一个 EmailField 也很顺利,它有 EmailValidator。奇怪的是,当我 运行 手动验证时,它会抛出 ValidationError.

In [1]: from django.core.validators import validate_email

In [2]: faulty_email = 'sid@h.in.'

In [3]: validate_email(faulty_email)
---------------------------------------------------------------------------
ValidationError        Traceback (most recent call last)
<ipython-input-3-bdbbd57d5fe1> in <module>() 
----> 1 validate_email(faulty_email)

/usr/local/lib/python2.7/dist-packages/django/core/validators.pyc in __call__(self, value)
    201             except UnicodeError:
    202                 pass
--> 203             raise ValidationError(self.message, code=self.code)
    204 
    205     def validate_domain_part(self, domain_part):

ValidationError: [u'Enter a valid email address.']

有人知道问题出在哪里吗?

当你 save() 一个模型时,你只是告诉 Django 将对象提交到数据库。它在保存期间不验证。如果字段没有数据库预期的格式,但 EmailField 只是数据库中的一个字符字段,它将抛出数据库异常。在保存它们之前你应该总是 validate your models:

user.email = faulty_email
try:
    user.full_clean()
except ValidationError as e:
    print(e)
else:
    user.save()

使用 ModelForm 时,您首先要验证表单(选中 form.is_valid())然后保存。