2010-06-16 13 views
17

Lo que me gustaría hacer (para un widget reciente de cambios -no un widget django en este caso) es pasar un urlname a mi plantilla como variable, luego usarlo como ese: {% url sitechangeobject.urlname %} Donde urlname es una cadena que contiene un nombre válido para una url.Pasar el nombre de URL variable a la etiqueta url en la plantilla django

¿Esto es posible? La plantilla sigue rompiendo diciendo que no puede encontrar sitechangeobject.urlname como un nombre (que es bastante correcto, no existe). ¿Hay alguna manera de hacer que se vea dentro de esa variable?

Hay otras maneras de resolver este problema, de lo contrario, solo pensé en comprobarlo.

Gracias!

Respuesta

27

Como de Django 1.3 el {% url %} etiqueta soporta correctamente:

{% url view_name_variable %} 
{% url 'view_name_string' %} 

... esto se convierte en el comportamiento predeterminado en Django 1.5.

Anteriormente, era sólo la opción de hacer esto:

{% url view_name_string %} 

Para obtener la etiqueta de trabajar de esta manera en Django 1.3 y 1.4 proyectos, necesitará la siguiente línea en la parte superior de todas las plantillas se utiliza en:

{% load url from future %} 

de acuerdo con la Django 1.3 release notes:

... en Django 1.5, el comportamiento antiguo será reemplazado por el nuevo comportamiento. Para garantizar la compatibilidad con futuras versiones de Django, las plantillas existentes deberían modificarse para usar las nuevas bibliotecas y sintaxis futuras.

Tenga en cuenta que la compatibilidad con {% load url from future %} se ha eliminado en Django 1.9.

+0

¿Cómo sería una variable se concatena con una cadena de sufijos para formar la url? Algo como '{% url variable-'suffix '%}', que por supuesto no funciona. – Romildo

+1

Me parece un poco extraño, pero creo que podría usar el filtro '| add'. es decir: '{% url variable | add: '- sufijo'%}' Ver el [agregar filtro de documentos] (https://docs.djangoproject.com/en/1.4/ref/templates/builtins/?from=olddocs# añadir). – meshy

8

Nota: esta respuesta solo es realmente relevante para las versiones de django anteriores a la 1.3. Si está utilizando django 1.3 o posterior, la funcionalidad requerida está incorporada; consulte meshy's answer.

La etiqueta incorporada url no puede hacer esto. Sin embargo, django-reversetag hace exactamente esto (y más).

Según el readme, la etiqueta reverse proporcionada por este código proporciona:

  • sintaxis Consistente ("literales de cadena" y variables)
  • capacidad de revertir Ver nombres almacenados en las variables de contexto
  • parciales revertir
1

si está utilizando Django 1.5 y versiones posteriores, ya no se requiere django-reversetags para simplemente pasar los nombres de las vistas como variables a plantillas, para usarlas dentro de la etiqueta url.

Estaba confundido con la disponibilidad de django-reversetags, solo pensé en actualizar el asunto correctamente aquí.

+0

No es necesario en 1.3 y superior. Solo usa '{% load url from future%}' – meshy

2

para django 1.5 puede ser que esto es útil

por lo general, para acceder a una variable pasada a la vista utilizamos {{variable}} Sin embargo

, por URL en la plantilla, el siguiente no funciona: {% url 'aplicación: espacio de nombres' {{varible}}%}

simplemente utilizar el siguiente está bien: {% url 'aplicación: espacio de nombres' varible%}

Cuestiones relacionadas