Django HttpResponseRedirect

时间:2011-04-28 18:44:14

标签: python django django-views django-urls

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

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)不会重定向到网址 - 它不会重定向到所有

5 个答案:

答案 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设置。

APPEND_SLASH

  

设置为True时,如果请求URL   与任何模式都不匹配   URLconf并没有以   斜杠,发出HTTP重定向   带有斜杠的相同网址。   请注意,重定向可能会导致任何重定向   在POST请求中提交的数据   丢失。