Redirect ke pola url bernama langsung dari urls.py di Django?

127

Di Django, bagaimana saya bisa melakukan redirect sederhana langsung dari urls.py? Secara alami saya adalah orang yang terorganisir dengan baik, mendukung prinsip KERING, jadi saya ingin mendapatkan target berdasarkan pola url yang dinamai, daripada mengkode url dengan keras.

lutut
sumber

Jawaban:

193

Jika Anda menggunakan Django 1.4 atau 1.5, Anda dapat melakukan ini:

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)),
    ...

Jika Anda menggunakan Django 1.6 atau lebih baru, Anda dapat melakukan ini:

from django.views.generic import RedirectView

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

Dalam Django 1.9, nilai default dari permanenttelah berubah dari True ke False. Karena itu, jika Anda tidak menentukan permanentargumen kata kunci, Anda dapat melihat peringatan ini:

RemovedInDjango19Warning: Nilai default 'RedirectView.permanent' akan berubah dari True ke False di Django 1.9. Tetapkan nilai eksplisit untuk membungkam peringatan ini.

lutut
sumber
18
Hanya sebuah catatan, ingatlah bahwa RedirectView memiliki permanen = Benar sebagai default.
Daniel Backman
8
Anda dapat mengalihkan semuanya! Seperti itu:(r'^.*/$', RedirectView.as_view(url='http://newurl.com')),
radtek
3
RedirectView akan memiliki permanen = Salah sebagai default di Django 1.9.
Gravity Grave
5
Adakah yang bisa menjelaskan apa itu 'my_named_pattern' dalam contoh di atas.
Jay Modi
1
meneruskan pattern_nameargumen untuk RedirectViewmengeksekusi terbalik untuk Anda saat panggilan menggunakan nama pola yang diberikan. Lainnya parameter yang berguna termasuk permanentdanquery_string .
tutuDajuju
32

Ini bekerja untuk saya.

from django.views.generic import RedirectView

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

Dalam contoh di atas '/'berarti itu akan mengarahkan ulang ke halaman indeks, di mana Anda dapat menambahkan pola url juga.

Jay Modi
sumber
5
Hanya sebuah catatan, ingat bahwa ini RedirectViewmemiliki permanent=Truedefault di versi Django yang lebih lama, dan permanent=Falsesebagai default di versi Django> = 1.9.
Flimm
20

untuk 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),
]
Glushiator
sumber
3
@Ali Pengalihan permanen biasanya memiliki kode HTTP 301, pengalihan sementara biasanya memiliki kode 302. Pengalihan permanen digunakan untuk memberi tahu browser tentang perubahan struktural situs. Pengalihan sementara digunakan untuk menunjukkan halaman baru yang akan ditampilkan setelah tindakan sisi server dinamis seperti login. Menurut dokumentasi permanent=Falseadalah default. Untuk perincian lebih lanjut silakan baca: docs.djangoproject.com/en/2.1/topics/http/shortcuts/#redirect developer.mozilla.org/en-US/docs/Web/HTTP/…
Glushiator
9

Cara ini didukung dalam versi Django yang lebih lama jika Anda tidak dapat mendukung RedirectView

Di view.py

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

Di url.py

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

Anda dapat membuatnya permanen dengan menggunakan HttpResponsePermanentRedirect

sirFunkenstine
sumber
7

Saya mencoba mengalihkan semua 404 ke beranda dan yang berikut ini berhasil:

from django.views.generic import RedirectView
...
under urlpatterns, added:
    url(r'^.*/$', RedirectView.as_view(url='/home/')),
    url(r'^$', RedirectView.as_view(url='/home/')),
Anurag
sumber