Django HttpResponseRedirect

问题描述 投票:0回答:6

我创建了一个基本的联系表单,当用户提交信息时,它应该重定向到“谢谢”页面。

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——它根本不重定向。

python django django-views django-urls
6个回答
29
投票

应该重定向的不是 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/
即可完成。


12
投票

所有响应都是正确的,但更好的方法是在

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原则


5
投票

我相信除了Aviral Dasgupta的解决方案之外,OP还需要更改相对url。

 return HttpResponseRedirect('/thanks/')

 return HttpResponseRedirect('/contact/thanks/')

/thanks/
应将 url 设为 root:
yoursite/thanks/
而不是
yoursite/contact/thanks/


3
投票

试试这个。这对我有用。

return HttpResponseRedirect('thanks/')

注意:- 删除前面的正斜杠


0
投票

使用 Django APPEND_SLASH 设置。

APPEND_SLASH

设置为True时,如果请求URL 与中的任何模式都不匹配 URLconf 并且它不以 斜杠,HTTP 重定向被发送到 附加斜杠的相同 URL。 请注意,重定向可能会导致任何 POST 请求中提交的数据 迷失了。


0
投票

“(r'^contact/thanks/$', contact_thanks),”中的“$”符号是什么

© www.soinside.com 2019 - 2024. All rights reserved.