2010-05-08 22 views
11

Estoy tratando de salida en formato bibtex en Django y la plantilla tiene el siguiente aspecto:¿Cómo se representa "{{" en una plantilla django?

@{{ pubentry.type }{, 
    author = {{% for author in pubentry.authors.all %}{{ author.first_name }} {{ author.middle_name }} {{ author.last_name }}{% if not forloop.last %} and {% endif %} 
       {% endfor %}}, 
    title  = {{{ pubentry.title }}}, 
    journal = {{{ pubentry.journal }}} 
} 

El problema es con el {{{ o {{%. Una forma de evitar el problema es agregar un espacio después del primer {, pero ese tipo de alterar el formato. ¿Cuál es la forma correcta de escapar de { en las plantillas de Django?

Respuesta

12

Tener un vistazo a la etiqueta templatetag:

salida uno de los personajes sintaxis que se utilizan para componer etiquetas de plantilla.

Dado que el sistema de plantillas tiene ningún concepto de "escapar", para mostrar uno de los bits usados ​​en etiquetas de plantilla, se debe utilizar la etiqueta {% templatetag %}.

lo que está después es decir:

{% templatetag openvariable %} 

tal vez hay una solución mejor, porque esto no aumenta la legibilidad ...

1

Con la etiqueta templatetag plantilla.

title  = {% templatetag openvariable %}{% templatetag openbrace %} pubentry.title {% templatetag closevariable %}{% templatetag closebrace %}, 
3

Otro enfoque (más flexible) puede ser la de convertir los valores a un valor bibtex similar antes de enviarlos a su plantilla. Probablemente necesites hacer esto de todos modos para escapar de algunos de los caracteres que bibtex/latex no puede manejar. Aquí hay algo similar que preparé antes:

import datetime 

class BibTeXString(unicode): 
    pass 

def bibtex_repr(obj): 
    """ A version of the string repr method, that always outputs variables suitable for BibTeX. """ 
    # If this has already been processed, it's ok 
    if isinstance(obj, BibTeXString): 
    return obj 
    # Translate strings 
    if isinstance(obj, basestring): 
    value = unicode(obj).translate(CHAR_ESCAPES).strip() 
    return BibTeXString('{%s}' % value) 
    # Dates 
    elif isinstance(obj, datetime.date): 
    return BibTeXString('{%02d-%02d-%02d}' % (obj.year, obj.month, obj.day)) 
    # Integers 
    if isinstance(obj, (int, long)): 
    return BibTeXString(str(obj)) 
    else: 
    return BibTeXString(repr(obj)) 


CHAR_ESCAPES = { 
    ord(u'$'): u'\\$', 
    ord(u'&'): u'\\&', 
    ord(u'%'): u'\\%', 
    ord(u'#'): u'\\#', 
    ord(u'_'): u'\\_', 
    ord(u'\u2018'): u'`', 
    ord(u'\u2019'): u"'", 
    ord(u'\u201c'): u"``", 
    ord(u'\u201d'): u"''" , 
    ord(u'\u2014'): u'---', 
    ord(u'\u2013'): u'--', 
} 

Incluso puede utilizar esto como un filtro de plantilla si quería, por lo que su plantilla se parece a:

@{{ pubentry.type }{, 
    author = {% filter bibtex %}{% for author in pubentry.authors.all %}{{ author.first_name }} {{ author.middle_name }} {{ author.last_name }}{% if not forloop.last %} and {% endif %}{% endfor %}}{% endfilter %}, 
    title  = {{ pubentry.title|bibtex }}, 
    journal = {{ pubentry.journal|bibtex }} 
} 

Pero podría escapar el contenido antes de que llegue a la plantilla, por lo que su plantilla solo tiene que hacer esto:

@{{ pubentry.type }{, 
    {% for field in fields %}{{ field }}{% if not forloop.last %},{% endif %}{% endfor %} 
} 

O incluso omita por completo la plantilla en esta etapa. ¡Buena suerte!

+0

¡Gracias! Suena interesante. Todavía estoy aprendiendo Django/Python (8 horas de exp hasta el momento) pero voy a analizar esto. – rxin

Cuestiones relacionadas