Django HttpResponseRedirect
我创建了一个基本的联系表单,当用户提交信息后,应该跳转到“感谢您”的页面。
views.py:
def contact(request):
# if no errors...
return HttpResponseRedirect('/thanks/')
urls.py:
(r'^contact/$', contact),
(r'^contact/thanks/$', contact_thanks),
这两个页面在写死的URL下都能正常工作。但是,当我在 /contact/
提交表单时,它却跳转到了 /contact
(没有斜杠),这个页面是不存在的(要么是404错误,要么是提示我需要加斜杠的错误页面)。
为什么它没有正确跳转呢?我该怎么解决这个问题?
更新:我现在的代码是 return HttpResponseRedirect('/contact/thanks/')
,但问题是提交按钮(使用POST方法)根本没有跳转到这个URL——根本没有跳转。
5 个回答
5
我觉得除了Aviral Dasgupta的解决方案,提问者还需要修改相对网址。
return HttpResponseRedirect('/thanks/')
改成
return HttpResponseRedirect('/contact/thanks/')
/thanks/
这个网址应该指向网站的根目录:yoursite/thanks/
,而不是 yoursite/contact/thanks/
。
13
所有的回答都是正确的,但更好的方法是给你的网址在 urls.py
文件中起个名字,然后在视图中用反向函数来引用它们(而不是在视图中直接写死网址)。
urls.py:
(r'^contact/$', contact, name='contact'),
(r'^contact/thanks/$', contact_thanks, name='thanks'),
然后在 views.py 中这样引用它们:
from django.urls import reverse
return HttpResponseRedirect(reverse('app_name:thanks'))
这样做对将来的维护更好,也符合 Django 的 DRY 原则,也就是“不要重复自己”。
29
不是说点击POST按钮后要重定向,而是视图需要重定向。
如果没有特别说明,表单(也就是HTML的form标签)会把数据发送到同一个网址。如果表单在/contact/这个地址上,它就会发送到/contact/(有斜杠或没有斜杠其实是一样的)。
你应该在视图中进行重定向到感谢页面。从文档中可以看到:
def contact(request):
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('/thanks/') # Redirect after POST
else:
form = ContactForm() # An unbound form
return render_to_response('contact.html', {
'form': form,
})
把/thanks/
改成/contact/thanks/
就可以了。