Weiterleiten zum benannten URL-Muster direkt von urls.py in Django?

127

Wie kann ich in Django eine einfache Weiterleitung direkt von urls.py durchführen? Natürlich bin ich ein gut organisierter Typ, der das DRY-Prinzip bevorzugt, daher möchte ich das Ziel anhand des benannten URL-Musters erhalten, anstatt die URL hart zu codieren.

Knie
quelle

Antworten:

193

Wenn Sie mit Django 1.4 oder 1.5 arbeiten, können Sie Folgendes tun:

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

Wenn Sie mit Django 1.6 oder höher arbeiten, können Sie Folgendes tun:

from django.views.generic import RedirectView

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

In Django 1.9 hat sich der Standardwert von permanentvon True in False geändert. Wenn Sie das permanentSchlüsselwortargument nicht angeben , wird möglicherweise die folgende Warnung angezeigt:

RemovedInDjango19Warning: Der Standardwert von 'RedirectView.permanent' wird in Django 1.9 von True in False geändert. Legen Sie einen expliziten Wert fest, um diese Warnung auszuschalten.

Knie
quelle
18
Denken Sie nur daran, dass RedirectView standardmäßig permanent = True hat.
Daniel Backman
8
Sie können alles umleiten! Wie so:(r'^.*/$', RedirectView.as_view(url='http://newurl.com')),
Radtek
3
RedirectView hat in Django 1.9 standardmäßig permanent = False.
Gravity Grave
5
Kann jemand erklären, was im obigen Beispiel 'my_named_pattern' ist?
Jay Modi
1
Übergeben eines pattern_nameArguments zur Ausführung der RedirectViewUmkehrung zum Zeitpunkt des Aufrufs unter Verwendung des angegebenen Musternamens. Andere nützliche Parameter sind permanentundquery_string .
TutuDajuju
32

Das funktioniert bei mir.

from django.views.generic import RedirectView

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

Im obigen Beispiel '/'wird auf die Indexseite umgeleitet, auf der Sie auch beliebige URL-Muster hinzufügen können.

Jay Modi
quelle
5
Nur eine Notiz, denken Sie daran , dass die RedirectViewhat permanent=Trueals Standard in älteren Versionen von Django, und permanent=Falseals Standard in Django - Versionen> = 1.9.
Flimm
20

für 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
quelle
3
@Ali Permanente Weiterleitungen haben normalerweise den HTTP-Code 301, temporäre Weiterleitungen haben normalerweise den Code 302. Permanente Weiterleitungen werden verwendet, um den Browser über die strukturellen Änderungen der Site zu informieren. Temporäre Weiterleitungen werden verwendet, um eine neue Seite anzugeben, die nach einer dynamischen serverseitigen Aktion wie der Anmeldung angezeigt werden soll. Laut Dokumentation permanent=Falseist die Standardeinstellung. Weitere Informationen finden Sie unter: docs.djangoproject.com/de/2.1/topics/http/shortcuts/#redirect developer.mozilla.org/en-US/docs/Web/HTTP/…
Glushiator
9

Diese Methode wird in älteren Versionen von Django unterstützt, wenn Sie RedirectView nicht unterstützen können

In view.py

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

In der url.py

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

Sie können es dauerhaft machen, indem Sie HttpResponsePermanentRedirect

sirFunkenstine
quelle
7

Ich habe versucht, alle 404 auf die Homepage umzuleiten, und Folgendes hat hervorragend funktioniert:

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