2013-03-29 5 views
103

In Django, wie kann ich eine einfache Weiterleitung direkt aus urls.py tun? Natürlich bin ich ein gut organisierter Typ, der das DRY-Prinzip bevorzugt, daher möchte ich das Ziel basierend auf dem genannten URL-Muster erreichen, anstatt die URL hart zu kodieren.Umleiten zu named url Muster direkt aus urls.py in Django?

Antwort

152

Wenn Sie auf Django sind 1.4 oder 1.5, können Sie dies 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 auf Django sind 1.6 oder höher, können Sie dies 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, Der Standardwert permanent wurde von True in False geändert. Aus diesem Grund, wenn Sie nicht das Schlüsselwort permanent Argument angeben, können Sie diese Warnung sehen:

RemovedInDjango19Warning: Standardwert von ‚RedirectView.permanent‘ wird von True auf False in Django 1.9 ändern. Legen Sie einen expliziten Wert zum Stummschalten dieser Warnung fest.

+17

Nur eine Notiz, denken Sie daran, dass die RedirectView als Standard permanent = True hat. –

+3

https://docs.djangoproject.com/de/1.7/ref/class-based-views/base/#redirectview – Wtower

+5

Sie können alles umleiten! Wie so: '' '(r '^. */$', RedirectView.as_view (url = 'http: //newurl.com')),' '' – radtek

8

Auf diese Weise wird in älteren Versionen von django unterstützt, wenn Sie nicht RedirectView

In view.py

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

Im url.py

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

Sie machen können unterstützen es dauerhaft unter Verwendung HttpResponsePermanentRedirect

24

Das funktioniert für mich.

from django.views.generic import RedirectView 

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

In obigem Beispiel '/' bedeutet es zur Indexseite umleitet, wo Sie auch alle URL-Muster hinzufügen.

+1

Nur ein Hinweis, denken Sie daran, dass 'RedirectView' in älteren Versionen von Django standardmäßig' permanent = True' und in Django-Versionen> = 1.9 standardmäßig 'permanent = False' ist. – Flimm

5

Ich habe versucht, alle 404 s auf der Homepage umzuleiten und die folgende funktionierte prima:

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