urls template django django-urls

template - Cómo pasar el parámetro url a reverse_lazy en Django urls.py



django views (6)

Tenga en cuenta que tengo 1 recurso y 2 urls (digamos uno nuevo y uno antiguo) conectados a ese recurso. Por lo tanto, quiero configurar la redirección de HTTP para una de las urls.

En myapp/urls.py tengo:

urlpatterns = patterns('''', url(r''^(?P<param>/d+)/resource$'', ''myapp.views.resource'', name=''resource-view'' ), )

En mycoolapp/urls.py quiero especificar:

from django.views.generic.simple import redirect_to from django.core.urlresolvers import reverse_lazy urlpatterns = patterns('''', url(r''^coolresource/(?P<param>/d+)/$'', redirect_to, { ''url'': reverse_lazy(''resourse-view'', kwargs={''param'': <???>}, current_app=''myapp'' ), } ), )

La pregunta es cómo pasar <param> a los reverse_lazy reverse_lazy (entonces, ¿qué poner en lugar de <???> en el ejemplo anterior)?


A partir de Django 1.6 puedes hacer esto ( Documentation ):

... from django.views.generic.base import RedirectView urlpatterns = patterns('''', url(r''^coolresource/(?P<param>/d+)/$'', RedirectView.as_view(pattern_name=''resource-view''), ), )


El método de coincidencia de expresiones regulares de Django para las urls permite definir y asignar variables:

( ?P<variable_name>...) define variable_name dependiendo de la uri se llama; así que lo que necesitas poner es: param lugar de <???>


La vista de redirección es excelente si está utilizando una url codificada, reemplazó a redirect_to que ahora está en desuso. No creo que puedas usarlo al redirigir y revertir desde urls.py. Aquí está mi solución, x es el objeto de respuesta en este caso:

from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect urlpatterns = patterns('''', .... url(r''^coolresource/(?P<param>/d+)/$'', lambda x, param: HttpResponseRedirect( reverse(''myapp.views.resource'', args=[param]) ), name=''resource-view-redirect''), .... )

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


No haría esto directamente en urls.py , sino que utilizaría RedirectView basado en clases para calcular la vista a la que redirigir a:

from django.views.generic.base import RedirectView from django.core.urlresolvers import reverse_lazy class RedirectSomewhere(RedirectView): def get_redirect_url(self, param): return reverse_lazy(''resource-view'', kwargs={''param'': param}, current_app=''myapp'')

Entonces, en tus urls.py puedes hacer esto:

urlpatterns = patterns('''', url(r''^coolresource/(?P<param>/d+)/$'', RedirectSomewhere.as_view()), )


No puede saber ni saber cuál es el valor hasta que se llame la vista, así que calcule la url dentro de ella.


Una de las posibles soluciones del problema general es usar un patrón de url codificado en lugar de reverse_lazy ( documentation )

url(r''^coolresource/(?P<param>/d+)/$'', redirect_to, {''url'': ''/%(param)s/resource''} ),

Pero no me gusta mucho, ya que me dificulta más hacer posibles cambios en las URL.