直接从Django中的urls.py重定向到命名的url模式?


127

在Django中,如何直接从urls.py中进行简单重定向?我自然是一个井井有条的人,赞成DRY原理,所以我想基于目标的url模式来获得目标,而不是对URL进行硬编码。

Answers:


193

如果您使用的是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关键字参数,则可能会看到以下警告:

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


18
仅需注意一点,请记住,RedirectView的默认值是永久= True。
Daniel Backman 2014年

8
您可以重定向所有内容!像这样:(r'^.*/$', RedirectView.as_view(url='http://newurl.com')),
radtek

3
在Django 1.9中,RedirectView的默认值将为永久= False。
重力坟墓

5
有人可以在上面的示例中解释什么是“ my_named_pa​​ttern”。
杰伊·莫迪2015年

1
传递pattern_name参数以RedirectView在调用时使用给定的模式名称为您执行反向操作。其他有用的参数包括permanentquery_string
tutuDajuju

32

这对我有用。

from django.views.generic import RedirectView

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

在上面的示例中'/',它将重定向到索引页面,您还可以在其中添加任何网址格式。


5
刚一说明,请记住,RedirectViewpermanent=True默认旧版本的Django的,并permanent=False作为默认的Django版本> = 1.9。
Flimm

20

对于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),
]

3
@Ali永久重定向通常具有HTTP代码301,临时重定向通常具有代码302。永久重定向用于向浏览器通知站点的结构更改。临时重定向用于指示在动态服务器端操作(如登录)后显示的新页面。根据文档permanent=False是默认的。有关详细信息,请阅读: docs.djangoproject.com/en/2.1/topics/http/shortcuts/#redirect developer.mozilla.org/en-US/docs/Web/HTTP/...
Glushiator

9

如果您不支持RedirectView,则在django的较早版本中支持此方法

在view.py

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

在url.py中

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

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


7

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

from django.views.generic import RedirectView
...
under urlpatterns, added:
    url(r'^.*/$', RedirectView.as_view(url='/home/')),
    url(r'^$', RedirectView.as_view(url='/home/')),
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.