2009-02-07 33 views

Respuesta

230

Es muy sencillo:

from django.http import HttpResponseRedirect 

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

Más información en la actualización de official Django docs

: Django 1.0

Aparentemente, hay una mejor manera de hacer esto en Django ahora usando generic views.

Ejemplo -

from django.views.generic.simple import redirect_to 

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

    #etc... 
) 

hay más en la generic views documentation. Crédito - Carles Barrobés.

Actualización # 2: Django 1.3+

En Django 1.5 redirect_to ya no existe y ha sido sustituido por RedirectView. Crédito para Yonatan

from django.views.generic import RedirectView 

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

Este ya no es el mejor método a partir de Django 1.0. Ver esta respuesta: http://stackoverflow.com/questions/523356/python-django-page-redirect/3841632#3841632 – Jake

+2

¿Por qué no usar 'redirect' from' django.shortcuts'? –

+4

Uso '('^ pattern/$', lambda x: redirect ('/ redirect/url /'))' – mrmagooey

38

De hecho, hay una manera más sencilla de tener una vista para cada redirigir - usted puede hacerlo directamente en 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, que es lo que estoy usando aquí .

+2

Cierto, pero usar la vista genérica' redirect_to' que viene con django es aún más fácil de leer. Vea la respuesta de Carles http://stackoverflow.com/questions/523356/python-django-page-redirect/3841632#3841632 – Day

25

Desde Django 1.1, también se puede utilizar la más simple redirect atajo:

from django.shortcuts import redirect 

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

También toma un argumento de palabra clave permanente = True opcional.

112

Dependiendo de lo que quiere (es decir, si usted no quiere hacer ningún pre-procesamiento adicional), es más sencillo de usar sólo redirect_to vista genérica de Django:

from django.views.generic.simple import redirect_to 

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

    #etc... 
) 

Ver documentation para ejemplos más avanzados.


Para Django 1.3+ uso:

from django.views.generic import RedirectView 

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

+1 para usar una vista genérica en lugar de implementar la suya (no importa cuán simple) como en el (actual) respuesta más votado. – Day

+0

¿Alguien tiene algún ejemplo si * desea * hacer un preprocesamiento adicional? – niallsco

+1

Luego, sugeriría que se escriba una vista personalizada que haga el procesamiento y luego se llama a la vista genérica, o se escribe un decorador, p. pre_procese y decora la vista genérica: (r '^ one/$', pre_process (redirect_to), {'url': '/ another /'}) –

10

Con Django versión 1.3, el enfoque basado en la clase es:

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

En este ejemplo se vive en urls.py en

6

Cuidado. Hice esto en un servidor de desarrollo y quería cambiarlo más tarde.

tuve que borrar mis memorias caché para cambiarlo. Con el fin de evitar este rascarse la cabeza en el futuro, yo era capaz de hacer que sea temporal, así:

from django.views.generic import RedirectView 

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

ok para 1.5 Django –

1

page_path = definir en urls.py

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

'deletePool'? Esa respuesta parece una copia-n-paste mal colocada ... –

12

Si desea redirigir su conjunto subcarpeta, el argumento url en RedirectView is actually interpolated, por lo que se puede hacer algo como esto en 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')), 
] 

El ?P<path> que captura se alimentará en RedirectView. Esta variable capturada se reemplazará en el argumento url que usted dio, dándonos /new_path/yay/mypath si su ruta original fue /old/yay/mypath.

También puede hacer ….as_view(url='…', query_string=True) si también desea copiar la cadena de consulta.

0

Esto debería funcionar en la mayoría de versiones de Django, lo estoy usando en 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'), 
    .... 
) 

También puede usar el nombre del patrón de URL en lugar de una URL codificado con esta solución. El parámetro location_id de la url se pasa a la función lambda.

Cuestiones relacionadas