2010-05-08 15 views
11

Sto cercando di output in formato BibTeX in Django e il modello si presenta così:Come rappresentare "{{" in un modello 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 }}} 
} 

Il problema è con il {{{ o {{%. Un modo per aggirare il problema è aggiungere uno spazio dopo il primo {, ma quel tipo di manomettere il formato. Qual è il modo giusto per sfuggire a { nei template di Django?

risposta

12

Dai un'occhiata alla tag templatetag:

uscita uno dei personaggi di sintassi utilizzati per comporre i tag template.

Dal momento che il sistema di modello ha alcun concetto di "fuga", per visualizzare uno dei bit usati nei tag di template, è necessario utilizzare il tag {% templatetag %}.

cosa siete dopo è:

{% templatetag openvariable %} 

Forse c'è una soluzione più bello, perché questo non aumenta la leggibilità ...

1

Con il tag templatetag modello.

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

Un altro (più flessibile) approccio può essere quello di convertire i valori in un valore di tipo bibtex prima di inviarli al modello. Probabilmente dovrai comunque farlo per sfuggire ad alcuni dei personaggi che Bibtex/Lattice non sono in grado di gestire. Ecco qualcosa di simile che ho preparato in precedenza:

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'--', 
} 

Si potrebbe anche usare questo come un filtro di modello se si voleva, rendendo il vostro modello di assomigliare:

@{{ 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 }} 
} 

Ma mi sarebbe sfuggito il contenuto prima che arrivi il modello, in modo che il tuo modello abbia solo bisogno di fare questo:

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

O addirittura lasciare il modello del tutto in questa fase. In bocca al lupo!

+0

Grazie! Sembra interessante - sto ancora imparando Django/Python (8 ore di exp finora) ma esaminerò questo. – rxin

Problemi correlati