我应该在这里使用HttpResponseRedirect吗?

问题描述:

我做的探戈Django的教程中,我已经成功地完成了教程,但是我在Django官方投票教程注意到以下方面:我应该在这里使用HttpResponseRedirect吗?

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,))) 

这里要注意的部分后,“总是返回一个HttpResponseRedirect成功处理POST数据“。然而,在探戈的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) 

通知缺乏HttpResponseRedirect,尽管使用POST数据。我不知道这是否正确?此外Django HttpResponseRedirect vs render_to_response - how to get a login form to behave the way I need it to

,在这里:

我已经在这里看了:Django HttpResponseRedirect

这里:Django: HttpResponseRedirect not working

这里Django form redirect using HttpResponseRedirect

最后在这里:Django: What is the difference b/w HttpResponse vs HttpResponseRedirect vs render_to_response

我还有事完全不了解如何使用HttpResponseRedirect。请帮忙。

在此先感谢任何回复的人。

+1

+1因为你做了一些非常彻底的研究。 :) –

+1

是的,TWD在这里确实是错误的。任何人都知道他们接受补丁吗? –

+0

@BlueIce在发布之前,我已经学会了研究。我不是新来的论坛,只是新的SO,我很抱歉没有尽快回复。我认为没有人回答我的问题,因为我没有收到邮件或任何东西。感谢所有伟大的回应。我不知道他们是否接受补丁。我提出了一个问题。这里:https://github.com/leifos/tango_with_django/issues/16 –

这是常见的做法,以防止用户在初始POST请求处理完服务器端后重新提交表单。

如果不处理POST请求后使用HttpResponseRedirect,其后果可能是你不经意插入多个重复的行到数据库或发送确认电子邮件不止一次等

+0

我必须在这里同意你的看法。只是我对Django很陌生,仍然在努力学习。我做了官方教程,并阅读了两篇文章,他们也推荐了这个。我在他的教程中也抓到了其他一些东西,比如到处都是硬编码的URL。据我了解这是一个可怕的做法。总的来说,我认为TWD不错,只是不完整。它允许有人从头到尾看到网站的构建,在线教程中并不常见。 –

+1

如果你不确定的问问题没什么问题 - 很乐意帮助 – dannymilsom

通知缺乏的HttpResponseRedirect尽管使用POST数据。我不知道这是否正确?

两者都“正确”,并会正常工作。但是,如果用户在浏览器上点击后退或刷新按钮,则从UI设计的角度来看,防止重新提交重新提交是更好的方法。

+1

是的,这就是我从教程中了解它的原因。谢谢。 –