我不明白这种行为。假设我打开一个Django shell并输入:
from django.contrib.auth.models import User
user = User.objects.create(username="toto", email="titi")
为什么Django允许我创建此用户(使用无效的电子邮件)而不会引发错误?
我在使用tastypie创建的API中的POST中创建用户具有相同的“无验证行为”。
问题是:
由于Django似乎没有单独检查这个,我应该在哪里执行这种验证,因为我不需要多次编写它们(因为用户可以通过多种方式创建,如网站,API,等)?
感谢。
答案 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
文件作为Form
和ModelForm
的中心位置。
Tastypie也是如此 - 默认配置假设提交的数据有效。您可以使用FormValidation
类来覆盖它,该类使用Django Form
或ModelForm
进行验证。一个完整的例子看起来像这样:
class UserResource(ModelResource):
class Meta:
queryset = User.objects.all()
validation = FormValidation(form_class=UserForm) # UserForm from above
# more options here....