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

时间:2014-01-10 10:33:27

标签: django

这是我的模特:

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

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

user = User(email='invalid e-mail address', 'password'='password_hash')
user.save()

为什么?

2 个答案:

答案 0 :(得分:3)

您需要调用.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.']}

来自full_clean()

的文档
  

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

答案 1 :(得分:1)

因为你必须使用ModelForm,或者覆盖你的save方法并在保存用户之前调用full_clean()方法。

来源:Django model fields validation