为什么Django在创建新用户时不检查电子邮件的完整性?

时间:2014-03-28 17:54:51

标签: django tastypie

我不明白这种行为。假设我打开一个Django shell并输入:

from django.contrib.auth.models import User
user = User.objects.create(username="toto", email="titi")

为什么Django允许我创建此用户(使用无效的电子邮件)而不会引发错误?

我在使用tastypie创建的API中的POST中创建用户具有相同的“无验证行为”。

问题是:

由于Django似乎没有单独检查这个,我应该在哪里执行这种验证,因为我不需要多次编写它们(因为用户可以通过多种方式创建,如网站,API,等)?

感谢。

1 个答案:

答案 0 :(得分:3)

如果您只是致电.create().save(),Django不会隐式执行任何验证 - 您需要明确使用model validation,或通过以下方式保存对象 ModelForm。您的模型验证示例如下所示:

user = User(username="toto", email="titi")
try:
    user.full_clean()
except ValidationError as e:
    # handle the error...
    pass
user.save()

或使用ModelForm

class UserForm(forms.ModelForm):
    class Meta:
        model = User

f = UserForm(dict(username="toto", email="titi"))
if f.is_valid():
    user = f.save()
else:
    # handle error, ...
    pass

模型验证和ModelForm都会调用模型字段的验证器,因此对于User的电子邮件,验证不需要额外的工作。如果您需要进行自定义验证you can do this in the ModelForm class - 通常会在应用中将forms.py文件作为FormModelForm的中心位置。

Tastypie也是如此 - 默认配置假设提交的数据有效。您可以使用FormValidation类来覆盖它,该类使用Django FormModelForm进行验证。一个完整的例子看起来像这样:

class UserResource(ModelResource):
    class Meta:
        queryset = User.objects.all()
        validation = FormValidation(form_class=UserForm)  # UserForm from above
        # more options here....