1

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

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

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
  • 如果表单验证,重定向到原始页面(隐藏字段中的 url,正如 ThiefMaster 建议的那样?)
  • 否则,在上下文中呈现带有表单的原始页面。
4

2 回答 2

1

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

假设调用了保存问题 id 的表单字段question,并且文件中有一个 URL 模式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})
于 2013-10-26T12:18:40.780 回答
0

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

于 2013-10-26T11:12:12.630 回答