【问题标题】:Using HttpResponseRedirect, but browser is not showing correct URL使用 HttpResponseRedirect,但浏览器未显示正确的 URL
【发布时间】:2013-08-21 23:29:48
【问题描述】:

我有一个接受用户输入的视图,并且在成功发布后,它会重定向到另一个页面。与教程中的代码几乎相同:

def quex(request, id, question_number):

    next_question = int(question_number) + 1
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            # Process the data in form.cleaned_data
            # ...
            return HttpResponseRedirect('/quex/' + id + '/' + str(next_question)) 
    else:
        form = QuestionForm() # An unbound form

    return render_to_response('questionnaire.html', {
        'form': form,
        'id' : id,
        'question_number' : question_number},
        RequestContext(request)

urls.py

urlpatterns = patterns('',    
    url(r'^$', 'django.contrib.auth.views.login'),
    url(r'^logout$', 'screening.views.logout_view'),
    url(r'^home/$', 'screening.views.home'),
    url(r'^quex/new/$', 'screening.views.new_quex'),
    # others omitted
    url(r'^quex/(?P<identifier>\w{8})/(?P<question_number>\d+)/', 'screening.views.quex'),
)

代码似乎可以正常工作并且页面运行正常。

我的问题是出现在客户端的 URL 没有正确更新。原始页面是http://foo.com/questionnaire//1/,重定向页面是http://foo.com/questionnaire//2/。即使在重定向之后,旧 URL 仍会继续显示在浏览器的地址栏中。

服务器状态消息看起来不错:

[19/Aug/2013 19:15:40] "GET /quex/P54C9UCS/1/ HTTP/1.1" 200 3225
[19/Aug/2013 19:15:44] "POST /quex/P54C9UCS/1/ HTTP/1.1" 302 0
[19/Aug/2013 19:15:44] "GET /quex/P54C9UCS/2/ HTTP/1.1" 200 3206

我做错了什么?如何让浏览器显示正确的 URL?

编辑:我做了更多的测试。 Chrome、Safari(在 OS X 和 iOS 上)和 Firefox 显示上述 URL。但是 iOS 上的 Browser Khmer 将 url 显示为 http://foo.com/quex/&lt;id&gt;/1/#/quex/&lt;id&gt;/2/

【问题讨论】:

  • 最好使用django的reverse()来构建HttpResponseRedirect里面的url
  • 检查next_question的值。真的是2吗?
  • @dan_klasson 是的。 next_question 真的是 2。页面显示这个数字。换句话说,页面第一次显示的url是foo.com/quex/<id>/1,但是页面显示的是问题2。但是,如果我在没有输入答案的情况下发布,页面会重新显示,因此我不得不输入响应.至此,URL 显示正确。
  • @user640916 可以试试。为什么更好?
  • @user640916 我切换到使用 reverse(),但问题仍然存在。

标签: django http-redirect


【解决方案1】:

没有测试,但是:

urls.py

urlpatterns = patterns('',    
    url(r'^$', 'django.contrib.auth.views.login'),
    url(r'^logout$', 'screening.views.logout_view'),
    url(r'^home/$', 'screening.views.home'),
    url(r'^quex/new/$', 'screening.views.new_quex'),
    # others omitted
    url(r'^quex/(?P<identifier>\w{8})/(?P<question_number>\d+)/$', 'screening.views.quex', name='quex-view'),
)

views.py

from django.core.urlresolvers import reverse_lazy


def quex(request, identifier, question_number):

    next_question = int(question_number) + 1
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass

            response_url = reverse_lazy('quex-view', kwargs={'identifier':identifier, 'question_number':next_question})
            return HttpResponseRedirect(reponse_url) 
    else:
        form = QuestionForm() # An unbound form

    return render_to_response('questionnaire.html', {
        'form': form,
        'identifier' : identifier,
        'question_number' : question_number},
        RequestContext(request)

【讨论】:

  • 这应该可以,但我会使用 reverse 而不是 reverse_lazy (from django.core.urlresolvers import reverse)
【解决方案2】:

你的最后一个 quex 正则表达式以 / 结尾,而不是 /$。先改变那个。您说您已在视图中切换到反向,以便单个正则表达式更改应该起作用。

【讨论】:

    【解决方案3】:

    您收到此错误是因为您将视图方法作为递归调用。这里 return HttpResponseRedirect('/quex/' + id + '/' + str(next_question)) 再次调用相同的方法,唯一的区别是 request.method 将从 POST 更改为 GET。第二次作为 get 方法,这将调用 return render_to_response ,您将看到 page.我希望你能完成我的工作。

    像这样更改您的代码:

    def quex(request, id, question_number):
        next_question = int(question_number) + 1
        if request.method == 'POST': # If the form has been submitted...
            form = ContactForm(request.POST) # A form bound to the POST data
            if form.is_valid(): # All validation rules pass
                # Process the data in form.cleaned_data
                # ...
                # Next line I have written, so you will get same value of question_number as you get after returning from HttpResponseRedirect
                question_number =  next_question + 1 
        form = QuestionForm() # An unbound form
    
        return render_to_response('questionnaire.html', {
            'form': form,
            'id' : id,
            'question_number' : question_number},
            RequestContext(request)
    

    此代码将用作您当前的代码。没有任何错误。 希望这对您有所帮助。

    【讨论】:

      【解决方案4】:

      浏览器在 URL 栏中显示的内容取决于您的客户端代码:

      • 简单的 HTML 表单将正确重定向。
      • jquery 的$.ajax() 调用将not redirect by default,因此即使代码有效,客户端也不会重定向。

      【讨论】:

        【解决方案5】:
        def quex(request, identifier, question_number):
        
            next_question = int(question_number) + 1
            if request.method == 'POST':
                form = ContactForm(request.POST)
                if form.is_valid():
                    return HttpResponseRedirect('/quex/' + identifier + '/' + str(next_question)) 
            else:
                form = QuestionForm() # An unbound form
        
            return render_to_response('questionnaire.html', {
                'form': form,
                'id' : identifier,
                'question_number' : question_number})
        
        1. 您的render_to_response() 缺少尾随)
        2. render_to_response() 的第三个参数是可选的。我通常把它关掉。但是,我会根据文档将其作为命名参数传递。 enter link description here
        3. 最后:您的 def quex(request, id, question_number): 应该是 def quex(request, identifier, question_number): 以匹配 url 模式。还将 quex 正文中的 id 引用更改为标识符(我在示例代码中包含)

        【讨论】:

          猜你喜欢
          • 2014-04-27
          • 1970-01-01
          • 1970-01-01
          • 2017-08-19
          • 2018-08-01
          • 1970-01-01
          • 2013-04-15
          • 2012-08-16
          • 1970-01-01
          相关资源
          最近更新 更多