sta*_*ver 31 forms django validation
在找到验证我的django表单的方法的过程中,我在django文档中遇到了两个方法is_valid()和clean().任何人都可以告诉我他们是如何不同/相同的?两者的优点和缺点是什么?
谢谢.
jon*_*scb 48
is_valid()clean()自动调用表单.您可以is_valid()在视图和clean()表单类中使用.
您的clean()函数将返回self.cleaned_data,如果您将在下面的视图中注意到,您作为程序员不会处理.
form = myforms.SettingsForm(request.POST)
if form.is_valid():
name = form.cleaned_data['name']
#do stuff
Run Code Online (Sandbox Code Playgroud)
您不必这样做,clean_data = form.is_valid()因为is_valid()将在要清理的表单对象中调用clean和overwrite数据.因此,您所在if form.is_valid()区块中的所有内容都将清晰有效.name您的块中的字段将是已清理的版本,不一定是其中的内容request.POST.
更新
您还可以使用此方法显示错误消息.在clean()如果表单数据是无效的,你可以在这样一个字段设置一个错误信息:
self._errors['email'] = [u'Email is already in use']
Run Code Online (Sandbox Code Playgroud)
现在is_valid()将返回False,因此在else块中,您可以使用覆盖的表单对象重新显示页面,如果模板使用错误字符串,它将显示错误消息.
小智 5
只是想补充一点,现在最好的方法是将一个错误添加到你在is_valid()中手动验证的表单,这是Form.add_error(field, error)用来符合Django的ErrorDict对象.
干
self._errors['field'] = ['error message']
Run Code Online (Sandbox Code Playgroud)
在渲染时会显得很时髦{{form.errors}},比如:
fielderror messsage
Run Code Online (Sandbox Code Playgroud)
而不是预期的
field
-error message
Run Code Online (Sandbox Code Playgroud)
所以改为:
self.add_error('email', 'Email is already in use')
Run Code Online (Sandbox Code Playgroud)
请参阅https://docs.djangoproject.com/en/1.10/ref/forms/api/#django.forms.Form.add_error