【发布时间】: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/<id>/1/#/quex/<id>/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