我创建了一个基本的联系表单,当用户提交信息时,它应该重定向到“谢谢”页面。
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——它根本不重定向。
应该重定向的不是 POST 按钮,而是视图。
如果没有不同指定,表单(HTML 表单标签)将 POST 到相同的 URL。如果表单位于 /contact/ 上,则它会 POST 到 /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/
即可完成。
所有响应都是正确的,但更好的方法是在
urls.py
中为您的 URL 命名,并在具有反向功能的视图中提示它们(而不是在视图中硬编码 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'))
这对未来的方法更好,并遵循Django的DRY原则。
我相信除了Aviral Dasgupta的解决方案之外,OP还需要更改相对url。
return HttpResponseRedirect('/thanks/')
到
return HttpResponseRedirect('/contact/thanks/')
/thanks/
应将 url 设为 root:yoursite/thanks/
而不是 yoursite/contact/thanks/
。
试试这个。这对我有用。
return HttpResponseRedirect('thanks/')
注意:- 删除前面的正斜杠
使用 Django APPEND_SLASH 设置。
设置为True时,如果请求URL 与中的任何模式都不匹配 URLconf 并且它不以 斜杠,HTTP 重定向被发送到 附加斜杠的相同 URL。 请注意,重定向可能会导致任何 POST 请求中提交的数据 迷失了。
“(r'^contact/thanks/$', contact_thanks),”中的“$”符号是什么