Pregunta

¿Cómo lograr una redirección sencilla (por ejemplo cflocation en ColdFusion o header(location:http://) para PHP) en Django?

¿Fue útil?

Solución

Es muy sencillo:

from django.http import HttpResponseRedirect

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

Más información en la documentación oficial de Django

Actualización: Django 1.0

Al parecer, 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 el puntos de vista genérico documentación . - 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/')),
)

Otros consejos

En función 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...
)

para ejemplos más avanzados.


Para el uso de Django 1.3+:

from django.views.generic import RedirectView

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

De hecho, hay una manera más sencilla de tener una vista para cada una redirección - 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')),
)

Un objetivo puede ser un exigible, así como una cadena , que es lo que estoy usando aquí.

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

from django.shortcuts import redirect

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

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

Si desea redirigir toda una subcarpeta, el argumento url en RedirectView es en realidad interpola , 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 capture se alimenta en RedirectView. Esta variable capturado será sustituida en el argumento url diste, que nos da /new_path/yay/mypath si su trayectoria original era /old/yay/mypath.

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

Con la versión 1.3 de Django, 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'),
)

Este ejemplo vive en en urls.py

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

he tenido 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/')),

Usted puede hacer esto en la sección Admin. Se explica en la documentación.

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

page_path = definir en urls.py

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

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

Puede seguir utilizando 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top