is_valid() vs clean() django 表单
Posted
技术标签:
【中文标题】is_valid() vs clean() django 表单【英文标题】:is_valid() vs clean() django forms 【发布时间】:2011-07-02 07:03:42 【问题描述】:在寻找验证我的 django 表单的方法的过程中,我在 django 文档中遇到了两种方法 is_valid() 和 clean()。谁能告诉我他们是如何不同/相同的?两者各有什么优缺点?
谢谢。
【问题讨论】:
【参考方案1】: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 块中,您可以使用覆盖的表单对象重新显示页面,如果您的模板使用错误字符串,它将显示错误消息。
【讨论】:
hi..如果在 views.py 函数中调用 is_valid() 时表单没有名为 clean() 的函数会怎样? 表单类中的clean_fieldName函数何时被调用,我有点困惑 在更新的 Django 版本中,clean()
不一定会返回 self.cleaned_data
。有时,特别是对于表单集,它不会返回任何内容。这给我带来了麻烦。他们在几个版本前取消了这个要求。【参考方案2】:
只是想补充一点,现在向您在 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
【讨论】:
以上是关于is_valid() vs clean() django 表单的主要内容,如果未能解决你的问题,请参考以下文章