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에서는 기본값 permanent이 True에서 False로 변경되었습니다. 이 때문에 permanent키워드 인수를 지정하지 않으면 다음 경고가 표시 될 수 있습니다.

Django 1.9에서 'RedirectView.permanent'의 기본값은 True에서 False로 변경됩니다. 이 경고를 끄려면 명시적인 값을 설정하십시오.


18
참고로 RedirectView의 기본값은 permanent = True입니다.
Daniel Backman

8
모든 것을 리디렉션 할 수 있습니다! 그래서처럼(r'^.*/$', RedirectView.as_view(url='http://newurl.com')),
radtek

3
RedirectView는 Django 1.9에서 기본적으로 영구적 = 거짓입니다.
Gravity Grave

5
누군가 위의 예에서 'my_named_pattern'이 무엇인지 설명 할 수 있습니까?
Jay Modi

1
주어진 패턴 이름을 사용하여 호출시 pattern_name인수를 전달 RedirectView하면 역순 으로 실행됩니다. 다른 유용한 매개 변수는 permanent및을 포함query_string 합니다.
tutuDajuju

32

이것은 나를 위해 작동합니다.

from django.views.generic import RedirectView

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

위의 예 '/'에서 URL 패턴을 추가 할 수있는 색인 페이지로 리디렉션됨을 의미합니다.


5
그냥 메모는이 기억 RedirectViewpermanent=True장고의 이전 버전에서 기본으로하고, permanent=False장고 버전> = 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 Permanent 리디렉션에는 일반적으로 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.