160

如何在 Django 中完成一个简单的重定向(例如cflocation,在 ColdFusion 中或header(location:http://)PHP 中)?

4

10 回答 10

253

这很简单:

from django.http import HttpResponseRedirect

def myview(request):
    ...
    return HttpResponseRedirect("/path/")

官方 Django 文档中的更多信息

更新:Django 1.0

现在使用 .django 显然有更好的方法来做到这一点generic views

例子 -

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',   
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

通用视图文档中有更多内容。信用卡 - Carles Barrobés

更新#2:Django 1.3+

在 Django 1.5中, redirect_to不再存在,已被RedirectView取代。归功于Yonatan

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)
于 2009-02-07T07:14:37.563 回答
114

根据您想要的(即,如果您不想进行任何额外的预处理),使用 Django 的redirect_to通用视图更简单:

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

有关更高级的示例,请参阅文档


对于 Django 1.3+ 使用:

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)
于 2010-10-01T17:31:30.680 回答
38

实际上,有一种比查看每个重定向更简单的方法 - 您可以直接在以下位置进行操作urls.py

from django.http import HttpResponsePermanentRedirect

urlpatterns = patterns(
    '',
    # ...normal patterns here...
    (r'^bad-old-link\.php',
     lambda request: HttpResponsePermanentRedirect('/nice-link')),
)

目标可以是可调用的,也可以是字符串,这就是我在这里使用的。

于 2010-01-17T08:07:32.017 回答
28

从 Django 1.1 开始,您还可以使用更简单的重定向快捷方式:

from django.shortcuts import redirect

def myview(request):
    return redirect('/path')

它还需要一个可选的 Permanent=True 关键字参数。

于 2010-09-05T11:09:03.537 回答
14

如果要重定向整个子文件夹,则 RedirectView 中的url参数实际上是 interpolated,因此您可以在以下位置执行以下操作urls.py

from django.conf.urls.defaults import url
from django.views.generic import RedirectView

urlpatterns = [
    url(r'^old/(?P<path>.*)$', RedirectView.as_view(url='/new_path/%(path)s')),
]

您捕获的?P<path>内容将被送入RedirectView. 然后,这个捕获的变量将在url您提供的参数中被替换,/new_path/yay/mypath如果您的原始路径是/old/yay/mypath.

….as_view(url='…', query_string=True)如果您还想复制查询字符串,也可以这样做。

于 2014-03-10T13:02:02.470 回答
10

使用 Django 1.3 版,基于类的方法是:

from django.conf.urls.defaults import patterns, url
from django.views.generic import RedirectView

urlpatterns = patterns('',
    url(r'^some-url/$', RedirectView.as_view(url='/redirect-url/'), name='some_redirect'),
)

此示例位于 urls.py 中

于 2011-09-14T12:55:33.050 回答
6

谨防。我在开发服务器上做了这个,以后想改变它。

我必须清除我的缓存才能更改它。为了避免将来出现这种令人头疼的问题,我可以像这样临时设置它:

from django.views.generic import RedirectView

url(r'^source$', RedirectView.as_view(permanent=False, 
                                      url='/dest/')),
于 2012-11-06T01:18:20.157 回答
1

您可以在“管理”部分执行此操作。它在文档中进行了解释。

https://docs.djangoproject.com/en/dev/ref/contrib/redirects/

于 2012-02-20T21:19:33.327 回答
1

page_path = 在 urls.py 中定义

def deletePolls(request):
    pollId = deletePool(request.GET['id'])
    return HttpResponseRedirect("/page_path/")
于 2013-07-12T12:45:36.080 回答
0

这应该适用于大多数版本的 django,我在 1.6.5 中使用它:

from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
urlpatterns = patterns('',
    ....
    url(r'^(?P<location_id>\d+)/$', lambda x, location_id: HttpResponseRedirect(reverse('dailyreport_location', args=[location_id])), name='location_stats_redirect'),
    ....
)

在此解决方案中,您仍然可以使用 url 模式的名称而不是硬编码的 url。来自 url 的 location_id 参数被传递给 lambda 函数。

于 2014-06-12T18:23:52.110 回答