表单验证失败后重定向

时间:2013-10-26 10:58:14

标签: python django

我有一个模板question.html,允许用户通过评论回答问题。如果成功,它会重定向到原始问题页面(/question/10或类似的东西)。

根据找到的表单here,处理评论的视图如下所示:

def comment(request):
    if request.method == 'POST': 
        form = CommentForm(request.POST) 
        if form.is_valid(): 
            # save, process, etc..
            # ...
            return HttpResponseRedirect(request.META['HTTP_REFERER']) 
    else:
        form = CommentForm()
    return render(request, 'question.html', {'form': form})

问题是:如何确保最后一次渲染显示相同的question/10,而不会丢失表单中的信息?我应该在question视图中处理表单验证吗?

编辑:好的,根据给出的答案,我想我还没有充分说明这个问题: 场景是对象DetailView有一个Question,我希望允许人们使用在同一视图上呈现的评论表单来评论该特定对象。我想要找出的是从表单处理帖子的位置,因为页面是由DetailView而不是formview呈现的。

  • 有多个DetailViews
  • 每个视图都使用commentform
  • 如果表单有效,请重定向到原始页面(隐藏字段中的网址,如ThiefMaster建议的那样?)
  • 否则,在上下文中使用表单呈现原始页面。

2 个答案:

答案 0 :(得分:0)

由于您不在每次提交时使用ajax并呈现问题表单,无论是否成功,查看处理评论应该知道它回答了哪个问题,并在两种情况下重定向到适当的问题视图。不同之处仅在于,如果注释成功,则会保存到db,如果没有,您可以选择保留输入的值以获得更好的可用性。但我没有看到任何保存成功评论的地方。

答案 1 :(得分:0)

您从评论表单中获得的数据必须已包含问题的ID(因为否则您将无法将评论与正确的问题相关联)。因此,如果您知道问题的ID,则可以使用reverse()获取其网址。

假设表单字段保留问题的ID称为question,并且urls.py文件中有一个URL模式,用于处理问题页面网址(/question/10或类似内容)叫question。然后你会这样做:

from django.core.urlresolvers import reverse

def comment(request):
    if request.method == 'POST': 
        form = CommentForm(request.POST) 
        if form.is_valid(): 
            # save, process, etc..
            # ...
            return HttpResponseRedirect(
                reverse('question', args=[form.cleaned_data.question])
            ) 
    else:
        form = CommentForm()
    return render(request, 'question.html', {'form': form})