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