139

在 Django 中,如何直接从 urls.py 进行简单的重定向?自然我是一个组织良好的人,支持 DRY 原则,所以我想根据它的命名 url 模式来获取目标,而不是硬编码 url。

4

6 回答 6

214

如果你使用的是 Django 1.4 或 1.5,你可以这样做:

from django.core.urlresolvers import reverse_lazy
from django.views.generic import RedirectView

urlpatterns = patterns('',
    url(r'^some-page/$', RedirectView.as_view(url=reverse_lazy('my_named_pattern'), permanent=False)),
    ...

如果你使用的是 Django 1.6 或更高版本,你可以这样做:

from django.views.generic import RedirectView

urlpatterns = patterns('',
    url(r'^some-page/$', RedirectView.as_view(pattern_name='my_named_pattern', permanent=False)),
    ...

在 Django 1.9 中, 的默认值permanent已从 True 更改为 False。因此,如果您不指定permanent关键字参数,您可能会看到以下警告:

RemovedInDjango19警告:在 Django 1.9 中,“RedirectView.permanent”的默认值将从 True 更改为 False。设置一个显式值以使此警告静音。

于 2013-03-29T15:41:57.983 回答
38

这对我有用。

from django.views.generic import RedirectView

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

在上面的示例'/'中意味着它将重定向到索引页面,您也可以在其中添加任何 url 模式。

于 2015-12-16T11:06:34.250 回答
25

对于 django v2+

from django.contrib import admin
from django.shortcuts import redirect
from django.urls import path, include


urlpatterns = [
    # this example uses named URL 'hola-home' from app named hola
    # for more redirect's usage options: https://docs.djangoproject.com/en/2.1/topics/http/shortcuts/
    path('', lambda request: redirect('hola/', permanent=False)),
    path('hola/', include("hola.urls")),
    path('admin/', admin.site.urls),
]
于 2018-09-03T12:24:56.300 回答
9

如果您不支持 RedirectView,旧版本的 django 支持这种方式

在视图.py

def url_redirect(request):
    return HttpResponseRedirect("/new_url/")

在 url.py

url(r'^old_url/$', "website.views.url_redirect", name="url-redirect"),

您可以通过使用使其永久化HttpResponsePermanentRedirect

于 2015-02-26T12:35:14.650 回答
9

我试图将所有 404 重定向到主页,以下效果很好:

from django.views.generic import RedirectView
...
under urlpatterns, added:
    url(r'^.*/$', RedirectView.as_view(url='/home/')),
    url(r'^$', RedirectView.as_view(url='/home/')),
于 2015-12-17T22:58:41.977 回答
0

您可以直接在 urls.py 上执行以下操作:

url(r'^story/(?P<pk>\d+)/',
        lambda request, pk: HttpResponsePermanentRedirect('/new_story/{pk}'.format(pk=pk)))

只需确保您准备好接收重定向的新 URL!另外,请注意重定向的类型,在我使用永久重定向的示例中

于 2020-12-10T06:01:51.637 回答