我创建了一个基本的联系表单,当用户提交信息时,它应该重定向到“谢谢”页面。
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)不会重定向到网址 - 它不会重定向到所有
答案 0 :(得分:20)
不应该重定向的POST按钮,而是视图。
如果没有不同的指定,表单(HTML表单标签)POST到同一个URL。如果表单在/ contact /上,则POST / on /(带或不带斜线,它是相同的)。
在视图中,您应该重定向到感谢。来自doc:
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/
,您就完成了。
答案 1 :(得分:11)
所有回复都是正确的,但更好的方法是在urls.py
中为您的网址命名,并在具有反向功能的视图中提示它们(而不是在视图中硬编码URL)。
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'))
这对未来的方法更好,并遵循the DRY principle of Django。
答案 2 :(得分:5)
我相信除了Aviral Dasgupta的解决方案外,OP还需要更改相对网址。
return HttpResponseRedirect('/thanks/')
到
return HttpResponseRedirect('/contact/thanks/')
/thanks/
应将网址设为root:yoursite/thanks/
而不是yoursite/contact/thanks/
。
答案 3 :(得分:2)
试试吧。它对我有用。
return HttpResponseRedirect('thanks/')
注意: - 在
之前删除正斜杠答案 4 :(得分:0)
使用Django APPEND_SLASH设置。
设置为True时,如果请求URL 与任何模式都不匹配 URLconf并没有以 斜杠,发出HTTP重定向 带有斜杠的相同网址。 请注意,重定向可能会导致任何重定向 在POST请求中提交的数据 丢失。