Django HttpResponseRedirect

24 投票
5 回答
108167 浏览
提问于 2025-04-16 16:36

我创建了一个基本的联系表单,当用户提交信息后,应该跳转到“感谢您”的页面。

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/就可以了。

撰写回答