2012-03-26 55 views
17

Considere que tengo 1 recurso y 2 URL (digamos uno nuevo y antiguo) conectados a ese recurso. Por lo tanto, quiero configurar la redirección HTTP para una de las URL.Cómo pasar el parámetro url a reverse_lazy en Django urls.py

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 kwargs (así, qué ponen en lugar de <???> en el ejemplo anterior)?

Respuesta

3

Uno de las posibles soluciones del problema general es utilizar patrón de URL modificable en lugar de reverse_lazy (documentation)

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

Pero, no me gusta tanto, ya que me hace más difícil hacer posibles cambios en las URL.

+0

enlace de documentación? página no encontrada – grgizem

+0

@grgizem la publicación creada hace medio año .. lo siento. De todos modos, he actualizado el enlace – gakhov

1

No se puede saber ni obtener el valor hasta que se llame a la vista, por lo tanto, calcule url dentro de ella.

0

método de ajuste de expresiones regulares de Django para las direcciones URL le permite a uno definir y asignar variables:

(?P<variable_name>...) define variable_name dependiendo de la uri ser llamado, así que lo que hay que poner es: param en lugar de <???>

+0

que no es cierto, al ver que el '' es en '' kwargs' de reverse_lazy' – gakhov

15

yo no haría esto directamente en el urls.py, que en vez usarían la RedirectView para calcular el fin de redirigir a basado en clases:

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

Luego, en su urls.py usted puede hacer esto:

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

redirección View es grande si usted está utilizando una URL codificado, que sustituyen redirect_to que ahora está en desuso. No creo que puedas usarlo al redireccionar e invertir desde urls.py. Aquí está mi solución, x es el objeto 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'), 
    .... 
) 

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.

+0

Esta es la solución más inteligente aquí –

2

A partir de Django 1.6 se puede 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'), 
    ), 
) 
+0

¿Cómo funciona esto si quieres pasar args o kwargs al patrón? – Flimm

+0

@Flimm esta respuesta podría ayudar http://stackoverflow.com/a/12150035/742390 – Pykler

Cuestiones relacionadas