Reindirizzare al modello url chiamato direttamente da urls.py in django?


127

In Django, come posso fare un semplice reindirizzamento direttamente da urls.py? Ovviamente sono un ragazzo ben organizzato, a favore del principio DRY, quindi vorrei ottenere il target in base al suo nome chiamato url, piuttosto che codificare duramente l'url.

Risposte:


193

Se sei su Django 1.4 o 1.5, puoi farlo:

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

Se sei su Django 1.6 o versioni successive, puoi farlo:

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, il valore predefinito di permanentè cambiato da Vero a Falso. Per questo motivo, se non si specifica l' permanentargomento della parola chiave, è possibile che venga visualizzato questo avviso:

RemovedInDjango19Avvertenza: il valore predefinito di 'RedirectView.permanent' cambierà da Vero a Falso in Django 1.9. Impostare un valore esplicito per silenziare questo avviso.


18
Solo una nota, ricorda che RedirectView ha permanente = True come predefinito.
Daniel Backman,

8
Puoi reindirizzare tutto! In questo modo:(r'^.*/$', RedirectView.as_view(url='http://newurl.com')),
Radtek,

3
RedirectView avrà permanenti = False come impostazione predefinita in Django 1.9.
Gravity Grave,

5
Qualcuno può spiegare cosa è "my_named_pattern" nell'esempio sopra.
Jay Modi,

1
passare l' pattern_nameargomento per RedirectVieweseguire l'inverso per te al momento della chiamata usando il nome del modello dato. Altri parametri utili includono permanentequery_string .
tutuDajuju,

32

Questo funziona per me.

from django.views.generic import RedirectView

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

Nell'esempio precedente '/'significa che reindirizzerà alla pagina dell'indice, dove è possibile aggiungere anche eventuali pattern URL.


5
Solo una nota, ricorda che RedirectViewha permanent=Truecome predefinito nelle versioni precedenti di Django e permanent=Falsecome predefinito nelle versioni Django> = 1.9.
Flimm,

20

per 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),
]

3
@Ali I reindirizzamenti permanenti di solito hanno il codice HTTP 301, i reindirizzamenti temporanei di solito hanno il codice 302. I reindirizzamenti permanenti vengono utilizzati per informare il browser delle modifiche strutturali del sito. I reindirizzamenti temporanei vengono utilizzati per indicare una nuova pagina da mostrare dopo un'azione dinamica lato server come l'accesso. Secondo la documentazione permanent=Falseè l'impostazione predefinita. Per maggiori dettagli, leggi: docs.djangoproject.com/en/2.1/topics/http/shortcuts/#redirect developer.mozilla.org/en-US/docs/Web/HTTP/…
Glushiator

9

In questo modo è supportato nelle versioni precedenti di django se non è possibile supportare RedirectView

In view.py

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

In url.py

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

Puoi renderlo permanente usando HttpResponsePermanentRedirect


7

Stavo cercando di reindirizzare tutti i 404 sulla home page e il seguente funzionava alla grande:

from django.views.generic import RedirectView
...
under urlpatterns, added:
    url(r'^.*/$', RedirectView.as_view(url='/home/')),
    url(r'^$', RedirectView.as_view(url='/home/')),
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.