2009-11-02 16 views
21

Necesito producir una identificación rodeada de llaves (por ejemplo "{1234}"). Con el lenguaje de plantilla django, las llaves también se utilizan para iniciar una sustitución de variable, por lo que tengo algunos problemas para obtener lo que quiero. Probé¿Cómo poner llaves en plantillas django?

{{{ id }}} 
{{ '{'id'}' }} 
{{ '{'+id+'}' }} 
{ {{ id }} } 

Ninguno de estos métodos funciona, excepto la última, que lamentablemente produce "{1234}", no lo que yo quiero. Actualmente tengo dos soluciones: o paso una variable de id que ya contiene el {} (feo) o escribo un filtro personalizado y luego escribo {{id | add_braces}} (lo prefiero).

Antes de seguir de esta manera, prefiero preguntar si existe una mejor solución.

El uso de valores escapados no funciona. Incluso si agrego {% autoescape off%}% 7B {% endautoescape%}, no obtengo el {, lo cual es extraño, pero ese es otro problema.

Gracias

Editar: Escribí un filtro rápido. Pegarlo aquí para que otra persona pueda usarlo como plantilla para escribir uno más complejo. Para poner en Application_Path paquete python/templatetags/formatting.py

from django import template 
from django.template.defaultfilters import stringfilter 

register = template.Library() 

@register.filter 
@stringfilter 
def add_braces(value): 
    return "{"+value+"}" 

Respuesta

28

Creo que su respuesta se puede encontrar aquí:

http://docs.djangoproject.com/en/dev/ref/templates/builtins/#templatetag

En resumen, que desea utilizar {% templatetag openbrace %} y {% templatetag closebrace %}.

Editar: Django ahora también incluye esta funcionalidad fuera de la caja:

{% verbatim %} {{ blah blah }} {% endverbatim %} 
+0

Gracias! en cualquier caso, escribí un filtro. Agregándolo así si alguien quiere usarlo como un pequeño ejemplo de filtro ... –

10

{% templatetag openbrace %} convierten extremadamente detallado para, por ejemplo, Plantillas de Javascript

que he usado la etiqueta verbatim de this gist con cierto éxito precisamente para este propósito que le permiten hacer algo así como

{{ request.user }} 
{% verbatim %} 
    brackets inside here are left alone, which is handy for e.g. jquery templates 
    {{ this will be left }} 
    {% so will this %} 
{% endverbatim }} 

{% more regular tags (to be replaced by the django template engine %} 
+0

la etiqueta de la plantilla verbatim ahora es parte de django (1.5): https://docs.djangoproject.com/en/1.5/ref/templates/builtins/# verbatim – stephendwolff

+0

La respuesta aceptada sobre esta pregunta probablemente debería cambiarse: al pie de la letra realmente es la forma correcta de hacerlo ahora. – shacker

0

La recomendación del lenguaje de plantillas Jinja trabaja con el sistema de plantillas de Django, así :

http://jinja.pocoo.org/docs/dev/templates/#escaping

La solución es la siguiente:

{{ '{' }}{{ id }}{{ '}' }} 

Por supuesto, las otras dos respuestas funcionan, pero esta es una menos verbosa y más legible, en mi opinión.

+0

Para pequeños valores literales, esta es una buena solución. Para bloques grandes, me gustaría ir con la etiqueta de bloque '{% verbatim%}'. – Rebs

Cuestiones relacionadas