¿Redirigir al patrón de URL con nombre directamente desde urls.py en django?

127

En Django, ¿cómo puedo hacer una redirección simple directamente desde urls.py? Naturalmente, soy un tipo bien organizado, que favorezco el principio DRY, por lo que me gustaría obtener el objetivo en función de su patrón de URL llamado, en lugar de codificar la URL.

Thnee
fuente

Respuestas:

193

Si estás en Django 1.4 o 1.5, puedes hacer esto:

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

Si tiene Django 1.6 o superior, puede hacer esto:

from django.views.generic import RedirectView

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

En Django 1.9, el valor predeterminado de permanentha cambiado de verdadero a falso. Debido a esto, si no especifica el permanentargumento de la palabra clave, puede ver esta advertencia:

RemovedInDjango19Warning: el valor predeterminado de 'RedirectView.permanent' cambiará de True a False en Django 1.9. Establezca un valor explícito para silenciar esta advertencia.

Thnee
fuente
18
Solo una nota, recuerde que RedirectView tiene permanente = Verdadero por defecto.
Daniel Backman
8
¡Puedes redirigir todo! De este modo:(r'^.*/$', RedirectView.as_view(url='http://newurl.com')),
radtek
3
RedirectView tendrá permanente = False como predeterminado en Django 1.9.
Gravity Grave
55
¿Alguien puede explicar qué es 'my_named_pattern' en el ejemplo anterior?
Jay Modi
1
pasar el pattern_nameargumento a RedirectViewejecuta inversa para usted en el momento de la llamada utilizando el nombre del patrón dado. Otros parámetros útiles incluyen permanentyquery_string .
tutuDajuju
32

Esto funciona para mi.

from django.views.generic import RedirectView

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

En el ejemplo anterior '/'significa que redirigirá a la página de índice, donde también puede agregar cualquier patrón de URL.

Jay Modi
fuente
55
Solo una nota, recuerde que RedirectViewtiene permanent=Truepor defecto en versiones anteriores de Django, y permanent=Falsepor defecto en versiones de Django> = 1.9.
Flimm
20

para 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),
]
Glushiator
fuente
3
@Ali Las redirecciones permanentes suelen tener el código HTTP 301, las redirecciones temporales suelen tener el código 302. Las redirecciones permanentes se utilizan para informar al navegador de los cambios estructurales del sitio. Las redirecciones temporales se usan para indicar que se mostrará una nueva página después de una acción dinámica del lado del servidor, como el inicio de sesión. De acuerdo con la documentación permanent=Falsees el valor predeterminado. Para obtener más detalles, lea: docs.djangoproject.com/en/2.1/topics/http/shortcuts/#redirect developer.mozilla.org/en-US/docs/Web/HTTP/…
Glushiator
9

Esta forma es compatible con versiones anteriores de django si no puede admitir RedirectView

En view.py

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

En la url.py

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

Puedes hacerlo permanente usando HttpResponsePermanentRedirect

señorFunkenstine
fuente
7

Estaba tratando de redirigir todos los 404 a la página de inicio y lo siguiente funcionó muy bien:

from django.views.generic import RedirectView
...
under urlpatterns, added:
    url(r'^.*/$', RedirectView.as_view(url='/home/')),
    url(r'^$', RedirectView.as_view(url='/home/')),
Anurag
fuente