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 表单的主要内容,如果未能解决你的问题,请参考以下文章

Django的ModelForm

Django 自定义字段验证器 vs. clean

mvn clean install vs. deploy vs. release

Django学习——forms组件源码分析

django form的函数用法

python测试开发django-114.ModelForm中局部钩子(clean_)和全局钩子校验