我应该在这里使用 HttpResponseRedirect 吗?

8 投票
2 回答
981 浏览
提问于 2025-04-17 20:42

我正在学习Tango with Django的教程,已经顺利完成了所有内容。不过我注意到在官方的Django投票教程中,有一点需要关注:

def vote(request, question_id):
p = get_object_or_404(Question, pk=question_id)
try:
    selected_choice = p.choice_set.get(pk=request.POST['choice'])
except (KeyError, Choice.DoesNotExist):
    # Redisplay the question voting form.
    return render(request, 'polls/detail.html', {
        'question': p,
        'error_message': "You didn't select a choice.",
    })
else:
    selected_choice.votes += 1
    selected_choice.save()
    # Always return an HttpResponseRedirect after successfully dealing
    # with POST data. This prevents data from being posted twice if a
    # user hits the Back button.
    return HttpResponseRedirect(reverse('polls:results', args=(p.id,)))

这里要注意的是“在成功处理POST数据后,始终返回一个HttpResponseRedirect。”然而,在Tango with Django的教程中:

def add_page(request, category_name_url):
context = RequestContext(request)

category_name = decode_url(category_name_url)

if request.method == 'POST':
    form = PageForm(request.POST)

    if form.is_valid():
        page = form.save(commit=False)

        try:
            cat = Category.objects.get(name=category_name)
            page.category = cat
        except Category.DoesNotExist:
            return render_to_response('rango/add_category.html', {}, context)

        page.views = 0
        page.save()

        return category(request, category_name_url)
    else:
        print(form.errors)
else:
    form = PageForm()

return render_to_response('rango/add_page.html',
                         {'category_name_url': category_name_url,
                          'category_name'    : category_name,
                          'form'             : form}, context)

尽管使用了POST数据,但却没有看到HttpResponseRedirect。我不知道这样是否正确?

我查看了这里:Django HttpResponseRedirect

还有这里:Django: HttpResponseRedirect不工作

还有这里:Django HttpResponseRedirect与render_to_response - 如何让登录表单按我需要的方式工作

还有这里:Django表单重定向使用HttpResponseRedirect

最后这里:Django: HttpResponse与HttpResponseRedirect与render_to_response之间有什么区别

我仍然不太明白如何使用HttpResponseRedirect。请大家帮帮我。

提前感谢任何回复的人。

2 个回答

0

注意到虽然使用了POST数据,但并没有HttpResponseRedirect。我不知道这样做是否正确?

这两种做法都是“正确”的,都会正常工作。不过,从用户界面的设计角度来看,使用重定向来防止重复提交是更好的选择,因为这样可以避免用户在浏览器中点击后退或刷新按钮时出现问题。

2

这是一个常见的做法,用来防止用户在服务器处理完第一次提交的表单后,再次提交同样的表单。

如果在处理完一个POST请求后不使用HttpResponseRedirect,可能会导致一些问题,比如不小心在数据库里插入多条重复的数据,或者发送确认邮件多次等等。

撰写回答