当电子邮件字段无效时,Django 不会抛出验证异常

Ric*_*nop 0 django

这是我的模型:

class User(models.Model):
    email = models.EmailField(db_index=True, unique=True)
    password = models.CharField(max_length=160, blank=True)
Run Code Online (Sandbox Code Playgroud)

即使电子邮件无效,此代码也不会引发 ValidationError:

user = User(email='invalid e-mail address', 'password'='password_hash')
user.save()
Run Code Online (Sandbox Code Playgroud)

为什么?

Roh*_*han 5

您需要调用.full_clean()方法来适当地验证属性。否则,记录将直接存储在 DB 中。

>>> u=User(email="something", username='x', password="p")
>>> u.full_clean()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/lib/python2.7/site-packages/django/db/models/base.py", line 824, in full_clean
    raise ValidationError(errors)
ValidationError: {'email': [u'Enter a valid e-mail address.']}
Run Code Online (Sandbox Code Playgroud)

从文档 full_clean()

请注意,当您调用模型的 save() 方法时,不会自动调用 full_clean()。当您想为自己手动创建的模型运行一步模型验证时,您需要手动调用它。