Django 使用HttpResponseRedirect,但浏览器未显示正确的URL

Django 使用HttpResponseRedirect,但浏览器未显示正确的URL,django,http-redirect,Django,Http Redirect,我有一个接受用户输入的视图,在一篇成功的文章中,它会重定向到另一个页面。这与教程中的代码基本相同: 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

我有一个接受用户输入的视图,在一篇成功的文章中,它会重定向到另一个页面。这与教程中的代码基本相同:

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)
url.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


编辑:我做了更多的测试。Chrome、Safari(在OSX和iOS上)和Firefox显示上述URL。但在iOS上,url显示为
http://foo.com/quex//1/#/quex//2/

最后一个quex正则表达式以/,而不是/$结尾。先换一下。您说您已在视图中切换到reverse,以便单个正则表达式更改可以工作。

没有测试它,但是:

url.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'),
)
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)

之所以出现此错误,是因为您正在以递归方式调用views方法。这里返回HttpResponseRedirect('/quex/'+id+'/'+str(next_question))再次调用相同的方法,唯一不同的是request.method将从POST更改为GET。第二次,作为get方法,这将调用return render_to_response,您将看到第页。我希望你能把我的电话接通

像这样更改代码:

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)
此代码将作为当前代码使用。没有任何错误。
希望这将对您完全有帮助。

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

  • 简单的HTML表单将正确重定向
  • jquery的
    $.ajax()
    调用将执行,因此即使代码正常工作,客户端也不会重定向
  • 您的
    render\u to\u response()
    缺少尾部
  • render\u to\u response()
    的第三个参数是可选的。我通常不说了。但是,根据文档,我会将其作为命名参数传入
  • 最后:您的
    def-quex(请求、id、问题编号):
    应该是
    def-quex(请求、标识符、问题编号):
    ,以匹配url模式。还将quex主体中的id引用更改为identifier(包括在示例代码中)

  • 最好使用django的reverse()在HttpResponseRedirect中构建url,检查
    next\u question
    的值。真的是
    2
    ?@dan_klasson是的。下一个问题是2。页面将显示此编号。换句话说,页面第一次显示url是,但页面显示的是问题2。但是,如果我在没有输入答案的情况下发布,页面会重新显示,因此我必须输入响应。此时,URL显示正确。@user640916可以尝试。为什么更好?@user640916我改为使用reverse(),但问题仍然存在。这应该可以,但我会使用reverse而不是reverse_lazy(从django.core.urlresolvers导入reverse)
    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)
    
    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})