2009-02-07 13 views

risposta

230

E 'semplice:

from django.http import HttpResponseRedirect 

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

Maggiori informazioni nella aggiornamento official Django docs

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

C'è di più nel generic views documentation. 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/')), 
) 
+8

Questo non è più il metodo migliore di Django 1.0. Vedi questa risposta: http://stackoverflow.com/questions/523356/python-django-page-redirect/3841632#3841632 – Jake

+2

Perché non utilizzare 'redirect' da' django.shortcuts'? –

+4

Io uso '('^ modello/$', lambda x: redirect ('/ redirect/url /'))' – mrmagooey

38

In realtà c'è un modo più semplice che avere una visione per ogni redirect - è possibile farlo direttamente in urls.py:

from django.http import HttpResponsePermanentRedirect 

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

A target can be a callable as well as a string, che è quello che sto usando qui .

+2

Vero, ma l'uso della vista generica' redirect_to' fornita con django è più semplice e più leggibile. Vedi Carles answer http://stackoverflow.com/questions/523356/python-django-page-redirect/3841632#3841632 – Day

25

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

from django.shortcuts import redirect 

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

Ci vuole anche un argomento parola chiave permanente = True opzionale.

112

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

Vedere documentation per gli esempi più avanzati.


per Django 1.3+ uso:

from django.views.generic import RedirectView 

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

+1 per usare una vista generica piuttosto che implementare la tua (non importa quanto semplice) come nella (attuale) la risposta più votata. – Day

+0

Qualcuno ha qualche esempio per se * si * desidera eseguire un'ulteriore pre-elaborazione? – niallsco

+1

Quindi suggerirei di scrivere una vista personalizzata che elabora e quindi chiama la vista generica o scrivi un decoratore, ad es. pre_processo e decorare la vista generica: (r '^ one/$', pre_process (redirect_to), {'url': '/ another /'}) –

10

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

Questo esempio vive in in urls.py

6

Attenzione. L'ho fatto su un server di sviluppo e volevo cambiarlo in seguito.

ho dovuto cancellare la mia cache di cambiarlo. Al fine di evitare questo testa-graffiare 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/')), 
+0

ok per 1.5 Django –

1

page_path = definire in urls.py

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

'deletePool'? Quella risposta sembra una copia-n-incolla fuori posto ... –

12

Se si desidera reindirizzare un intero sottocartella, l'argomento url in RedirectView is actually interpolated, 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 numero ?P<path> acquisito verrà inserito in RedirectView. Questa variabile acquisita verrà quindi sostituita nell'argomento url, dandoci /new_path/yay/mypath se il percorso originale era /old/yay/mypath.

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

0

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

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