Doğrudan django'daki urls.py'den adlandırılmış url kalıbına yönlendirilsin mi?


128

Django'da, doğrudan urls.py'den basit bir yönlendirmeyi nasıl yapabilirim? Doğal olarak ben DRY prensibini tercih eden iyi organize olmuş bir adamım, bu yüzden hedefi URL'yi zor kodlamak yerine adlandırılmış url kalıbına göre almak istiyorum.

Yanıtlar:


194

Django 1.4 veya 1.5 üzerindeyseniz, bunu yapabilirsiniz:

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 veya üzerindeyseniz, bunu yapabilirsiniz:

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'da, varsayılan değeri True'dan False'a permanentdeğiştirildi. Bu nedenle, permanentanahtar kelime bağımsız değişkenini belirtmezseniz şu uyarıyı görebilirsiniz:

RemovedInDjango19Warning: 'RedirectView.permanent'in varsayılan değeri Django 1.9'da True'dan False'a değişecektir. Bu uyarıyı susturmak için açık bir değer ayarlayın.


18
Sadece bir not, RedirectView varsayılan olarak permanent = True değerine sahip olduğunu unutmayın.
Daniel Backman

8
Her şeyi yeniden yönlendirebilirsiniz! (r'^.*/$', RedirectView.as_view(url='http://newurl.com')),
Şöyle

3
RedirectView, Django 1.9'da varsayılan olarak permanent = False'a sahip olacaktır.
Mezar Yerçekimi

5
Birisi yukarıdaki örnekte 'my_named_pattern'in ne olduğunu açıklayabilir mi?
Jay Modi

1
Verilen desen adını kullanarak çağrı zamanında sizin için tersi yürütmek için pattern_namebağımsız değişken iletmek RedirectView. Diğer kullanışlı parametreler arasında permanentvequery_string .
tutuDajuju

32

Bu benim için çalışıyor.

from django.views.generic import RedirectView

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

Yukarıdaki örnekte '/', herhangi bir url kalıbı da ekleyebileceğiniz dizin sayfasına yeniden yönlendirileceği anlamına gelir.


5
Sadece bir nota unutmayın RedirectViewvardır permanent=TrueDjango eski sürümlerinde varsayılan olarak, ve permanent=FalseDjango sürümlerinde> = 1.9 varsayılan olarak.
Flimm

21

django v2 + için

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 Kalıcı yönlendirmelerde genellikle HTTP kodu 301, geçici yönlendirmelerde genellikle 302 kodu bulunur. Kalıcı yönlendirmeler sitenin yapısal değişikliklerini tarayıcıya bildirmek için kullanılır. Oturum açma gibi dinamik bir sunucu tarafı eyleminden sonra gösterilecek yeni bir sayfayı belirtmek için geçici yönlendirmeler kullanılır. Belgelere göre permanent=Falsevarsayılandır. Daha fazla ayrıntı için lütfen okuyun: docs.djangoproject.com/en/2.1/topics/http/shortcuts/#redirect developer.mozilla.org/en-US/docs/Web/HTTP/…
Glushiator

9

Bu yol, django'nun eski sürümlerinde, RedirectView'ı destekleyemiyorsanız desteklenir

View.py içinde

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

Url.py içinde

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

Kullanarak kalıcı hale getirebilirsiniz HttpResponsePermanentRedirect


8

Tüm 404'leri ana sayfaya yönlendirmeye çalışıyordum ve aşağıdakiler harika çalıştı:

from django.views.generic import RedirectView
...
under urlpatterns, added:
    url(r'^.*/$', RedirectView.as_view(url='/home/')),
    url(r'^$', RedirectView.as_view(url='/home/')),
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.