【发布时间】:2011-07-02 07:03:42
【问题描述】:
在寻找验证我的 django 表单的方法的过程中,我在 django 文档中遇到了两种方法 is_valid() 和 clean()。谁能告诉我他们是如何不同/相同的?两者各有什么优缺点?
谢谢。
【问题讨论】:
标签: django forms validation
在寻找验证我的 django 表单的方法的过程中,我在 django 文档中遇到了两种方法 is_valid() 和 clean()。谁能告诉我他们是如何不同/相同的?两者各有什么优缺点?
谢谢。
【问题讨论】:
标签: django forms validation
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
您不必执行clean_data = form.is_valid(),因为is_valid() 将调用 clean 并覆盖要清理的表单对象中的数据。因此,if form.is_valid() 块中的所有内容都将是干净且有效的。您块中的 name 字段将是经过清理的版本,不一定是 request.POST 中的内容。
更新
您还可以使用它显示错误消息。在clean() 中,如果表单数据无效,您可以在如下字段中设置错误消息:
self._errors['email'] = [u'Email is already in use']
现在is_valid() 将返回 False,因此在 else 块中,您可以使用覆盖的表单对象重新显示页面,如果您的模板使用错误字符串,它将显示错误消息。
【讨论】:
clean() 不一定会返回 self.cleaned_data。有时,特别是对于表单集,它不会返回任何内容。这给我带来了麻烦。他们在几个版本前取消了这个要求。
只是想补充一点,现在向您在 is_valid() 中手动验证的表单添加错误的最佳方法是使用 Form.add_error(field, error) 以符合 Django 的 ErrorDict 对象。
在做
self._errors['field'] = ['error message']
在渲染 {{form.errors}} 时会显得很时髦,比如:
fielderror messsage
而不是预期的
field
-error message
改为这样做:
self.add_error('email', 'Email is already in use')
见https://docs.djangoproject.com/en/1.10/ref/forms/api/#django.forms.Form.add_error
【讨论】: