如何在Django中编写好的表单验证?

时间:2010-12-10 23:58:49

标签: django security django-forms validation django-views

我见过Django的样本,我可以看到他们有很好的错误处理。但是,我想看看是否还有更好的方法,一种处理Django中的表单验证错误的一般模式。这是我找到的样本here

def contact(request):
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            # Process the data in form.cleaned_data
            # ...
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = ContactForm() # An unbound form

    return render_to_response('contact.html', {
        'form': form,
    })

特别是,我想知道:

  1. “/ thanks /”中的视图如何确保表单已经过验证?有没有通用的方法将表单的成功验证传递给下一个视图?或者我是否需要手动执行某些操作,例如在请求会话中设置标记?

  2. 如何以表格无效且页面在提交时显示错误的方式编写此代码,如果用户刷新浏览器,则不会询问用户是否要再次POST数据

  3. 编辑:关于#1,我指的是用户手动输入'/ thanks /'网址或来回浏览历史记录页面并意外打开而未经任何形式验证的情况。 (我们仍然会显示“感谢”页面吗?或者我们需要以某种方式重新验证我们为什么感谢您的观点)。

2 个答案:

答案 0 :(得分:1)

  1. 视图可以确保表单已经过验证,因为只有在表单有效时才会调用它...

  2. 如果页面是通过帖子请求生成的,浏览器会在点击刷新时总是询问您...我想避免这种情况的唯一方法就是重定向到另一个页面!

答案 1 :(得分:1)

  

“/ thanks /”中的视图如何确保表单已经过验证?

form.is_valid()应彻底检查任何字段或 - 如有必要 - 任何组合,角落等等。基本上就是这样。视图知道,表单在呈现时有效。不需要在会话中包含冗余信息。

  

如何以表格无效且页面在提交时显示错误的方式编写此代码,如果用户刷新浏览器,则不会询问用户是否要再次发布数据?

我不确定这是什么意思。表单包含错误,用户可以更正或离开。要呈现不要求重新提交表单的页面,可以使用重定向,就像在有效情况下一样。在这种情况下,必须手动完成错误标记。