is_valid()vs clean()django表单

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块中,您可以使用覆盖的表单对象重新显示页面,如果模板使用错误字符串,它将显示错误消息.

  • 当调用表单类中的clean_fieldName函数时,我有点困惑 (2认同)

小智 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