Domanda

Come faccio a compiere un semplice reindirizzamento (ad esempio cflocation in ColdFusion, o header(location:http://) per PHP) in Django?

È stato utile?

Soluzione

E 'semplice:

from django.http import HttpResponseRedirect

def myview(request):
    ...
    return HttpResponseRedirect("/path/")

Più informazioni nel documentazione ufficiale Django

Aggiornamento: Django 1.0

C'è evidentemente un modo migliore di fare questo in Django ora utilizzando generic views.

Esempio -

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',   
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

Non c'è più nel vista generico documentazione . Credito -. Carles Barrobés

Aggiornamento # 2: Django 1.3 +

In Django 1.5 redirect_to non esiste più ed è stato sostituito da RedirectView . Credito al Yonatan

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)

Altri suggerimenti

A seconda di ciò che si vuole (vale a dire se non si vuole fare qualsiasi ulteriore pre-processing), è più semplice utilizzare solo redirect_to vista generico di Django:

from django.views.generic.simple import redirect_to

urlpatterns = patterns('',
    (r'^one/$', redirect_to, {'url': '/another/'}),

    #etc...
)

documentazione per gli esempi più avanzati.


Per uso Django 1.3+:

from django.views.generic import RedirectView

urlpatterns = patterns('',
    (r'^one/$', RedirectView.as_view(url='/another/')),
)

In realtà c'è un modo più semplice che avere una visione per ogni reindirizzamento - si può fare direttamente in urls.py:

from django.http import HttpResponsePermanentRedirect

urlpatterns = patterns(
    '',
    # ...normal patterns here...
    (r'^bad-old-link\.php',
     lambda request: HttpResponsePermanentRedirect('/nice-link')),
)

Un obiettivo può essere un callable così come una stringa , che è quello che sto usando qui.

Dal Django 1.1, è possibile utilizzare anche il più semplice reindirizzamento scorciatoia:

from django.shortcuts import redirect

def myview(request):
    return redirect('/path')
:

Ci vuole anche un argomento chiave = true permanente opzionale.

Se si desidera reindirizzare un intero sottocartella, l'argomento url in RedirectView è in realtà interpolato , in modo da poter fare qualcosa di simile in urls.py:

from django.conf.urls.defaults import url
from django.views.generic import RedirectView

urlpatterns = [
    url(r'^old/(?P<path>.*)$', RedirectView.as_view(url='/new_path/%(path)s')),
]

Il ?P<path> catturare verrà immessa nella RedirectView. Questa variabile catturato sarà poi sostituito nella discussione url hai dato, dandoci /new_path/yay/mypath se il percorso originale era /old/yay/mypath.

È anche possibile fare ….as_view(url='…', query_string=True) se si desidera copiare la stringa di query sopra pure.

Con Django versione 1.3, l'approccio basato classe è:

from django.conf.urls.defaults import patterns, url
from django.views.generic import RedirectView

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

In questo esempio vive in in urls.py

Attenzione. Ho fatto questo su un server di sviluppo e volevo cambiare in un secondo momento.

Ho dovuto cancellare la mia cache di cambiarlo. Al fine di evitare questo testa-graffio in futuro, sono stato in grado di farlo temporanea in questo modo:

from django.views.generic import RedirectView

url(r'^source$', RedirectView.as_view(permanent=False, 
                                      url='/dest/')),

È possibile farlo nella sezione Amministrazione. E 'spiegato nella documentazione.

https://docs.djangoproject.com/en/dev/ref / contrib / reindirizza /

page_path = definire in urls.py

def deletePolls(request):
    pollId = deletePool(request.GET['id'])
    return HttpResponseRedirect("/page_path/")

Questo dovrebbe funzionare nella maggior parte delle versioni di Django, Io lo utilizzo in 1.6.5:

from django.core.urlresolvers import reverse
from django.http import HttpResponseRedirect
urlpatterns = patterns('',
    ....
    url(r'^(?P<location_id>\d+)/$', lambda x, location_id: HttpResponseRedirect(reverse('dailyreport_location', args=[location_id])), name='location_stats_redirect'),
    ....
)

È comunque possibile utilizzare il nome del modello URL invece di un URL hard coded con questa soluzione. Il parametro location_id dall'URL è tramandata alla funzione lambda.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top