djangoのurls.pyから直接名前付きURLパターンにリダイレクトしますか?


127

Djangoで、urls.pyから直接単純なリダイレクトを行うにはどうすればよいですか?当然、私はよく整理された人で、DRYの原則を支持しているので、URLをハードコーディングするのではなく、名前付きのURLパターンに基づいてターゲットを取得したいと思います。

回答:


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では、のデフォルト値がpermanentTrueからFalseに変更されました。このため、permanentキーワード引数を指定しないと、次の警告が表示されることがあります。

RemovedInDjango19Warning:Django 1.9では、「RedirectView.permanent」のデフォルト値がTrueからFalseに変更されます。明示的な値を設定して、この警告を止めます。


18
ただのメモですが、RedirectViewには、デフォルトで、permanent = Trueがあることに注意してください。
ダニエルバックマン2014年

8
すべてをリダイレクトできます!そのように:(r'^.*/$', RedirectView.as_view(url='http://newurl.com')),
radtek、

3
RedirectViewは、Django 1.9のデフォルトとして、permanent = Falseになります。
重力の墓

5
上の例の「my_named_pa​​ttern」が何か説明できますか?
Jay Modi

1
pattern_name引数を渡すと、指定さRedirectViewれたパターン名を使用して呼び出し時に逆方向に実行されます。その他の便利なパラメータには、permanentおよびがありquery_stringます。
tutuDajuju 2016

32

これでうまくいきます。

from django.views.generic import RedirectView

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

上記の例'/'は、URLページを追加できるインデックスページにリダイレクトすることを意味します。


5
ただ、ノート、ということを覚えRedirectViewているpermanent=Trueジャンゴの古いバージョンでは、デフォルトとして、そしてpermanent=FalseDjangoのバージョン> = 1.9のデフォルトとして。
Flimm

20

ジャンゴ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/')),
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.