【问题标题】:Redirect after form validation fails表单验证失败后重定向
【发布时间】:2013-11-05 12:25:50
【问题描述】:

我有一个模板question.html,允许用户通过 cmets 回答问题。如果成功,它会重定向到原始问题页面(/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 视图中处理表单验证吗?

编辑:好的,根据给出的答案,我认为我没有足够地指定问题: 场景是对象Question 有一个DetailView,我希望允许人们使用在同一视图上呈现的评论表单来评论该特定对象。鉴于页面是由 DetailView 而不是 formview 呈现的,我想要找出的是在哪里处理表单中的帖子。

  • 有多个DetailViews
  • 每个视图都使用一个评论表单
  • 如果表单验证,重定向到原始页面(隐藏字段中的 url,正如 ThiefMaster 建议的那样?)
  • 否则,在上下文中呈现带有表单的原始页面。

【问题讨论】:

  • 使用referer重定向回来是个坏主意。您应该改为通过隐藏字段发送返回 URL(如果它不总是相同的)

标签: python django


【解决方案1】:

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

假设保存问题 id 的表单字段名为 questionurls.py 文件中有一个 URL 模式用于处理问题页面 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})

【讨论】:

  • 这很有意义。谢谢,我不知道反向可以这样使用。如果表单无效,您将如何呈现正确的问题页面?只需使用问题模板中的表单属性即可?
  • 这是一个单独的问题,但我想我会更改问题视图,因此它可以选择将评论表单作为参数(默认为常规未绑定表单),然后对无效表单执行此操作:return question(request, form.cleaned_data.question, comment_form=form)
【解决方案2】:

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

【讨论】:

  • 啊,真的。我已经编辑了这个问题。问题仍然存在;如果评论不成功(验证失败),我如何确保最后的 render 向我显示正确的问题?或者用你的话来说:我如何告诉处理评论的视图重定向到它回答的问题而不丢失上下文?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 2016-06-28
相关资源
最近更新 更多