【问题标题】:Django Form Error Handling: Wrong url? is_valid()Django 表单错误处理:错误的 url?已验证()
【发布时间】:2011-10-31 14:49:03
【问题描述】:

你好 Stackoverflow 的人,

如果表单提交到新页面并且表单验证失败,我对 Django 表单处理感到恼火。我打算返回之前提交的表单,并显示错误消息以进行更正。

将显示错误消息,但 url 链接没有改变。 如何更改 is_valid() 语句* 的 *else 语句,以便重定向到之前的形式?

感谢您的建议!

urls.py

urlpatterns = patterns("",
    url(r"^add/$", "remap.views.add_project", name="add_project_location"),
    url(r"^add/details/$", "remap.views.add_project_details", name="add_project_details"),
)

views.py

def add_project_details(request):
if request.method == 'POST': # If the form has been submitted...
    locationForm = LocationForm(request.POST) 
    if locationForm.is_valid(): # All validation rules pass
        locality = locationForm.cleaned_data['locality']
        state = locationForm.cleaned_data['state']
        country = locationForm.cleaned_data['country']

        projectForm = ProjectForm(initial = { 
            'locality': locality, 
            'state': state, 
            'country': country, 
        })
        return render_to_response('map/add_project_details.html', {
            'projectForm': projectForm,
        }, context_instance = RequestContext(request))

    else:
        print locationForm.errors 
        return render_to_response('map/add_project_location.html', {
            'locationForm': locationForm,
        }, context_instance = RequestContext(request))
else:
    return HttpResponseRedirect('../') # Redirect to the location reg if site is requested w/o proper location 

【问题讨论】:

    标签: django forms validation redirect


    【解决方案1】:

    没有理由对 Django 完全按照它的设计目标感到恼火。

    您的重定向位于与if request.method == 'POST' 对应的else 子句上。因此,只有在这不是表单提交时才会生效。换句话说,该视图永远不会真正显示一个空表单。

    然后,根据 POSTed 表单是否有效,您将显示两个模板之一。此时您没有进行任何重定向。

    但是,即使您在表单无效时要求 Django 重定向,我怀疑您是否会得到您想要的结果。这是因为 HTTP(不是 Django)的规则说您不能重定向 POST - 所以您对重定向视图的请求将是 GET,没有任何无效数据或错误消息。

    【讨论】:

      【解决方案2】:

      除非您告诉浏览器进行重定向,否则您无法更新网址。您在同一个 url 上返回两个不同的 html 版本,这可能会让用户感到困惑。

      你应该做的是有两个视图。 /add url 和 add_project_location 视图将接受一个帖子并验证,停留在该 url 上并查看直到成功。

      成功后它会设置一些会话变量,重定向到 add_project_details 页面。由于浏览器的工作方式,像这样合并它们是不可能的。

      【讨论】:

        猜你喜欢
        • 2016-01-01
        • 2011-02-01
        • 2016-03-20
        • 2011-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-11
        • 1970-01-01
        相关资源
        最近更新 更多