2010-05-08 11 views
11

Ich versuche, in bibtex-Format in Django und die Vorlage sieht wie folgt auszugeben:Wie stellt man "{{" in einer Django-Vorlage dar?

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

Das Problem mit dem {{{ oder {{% ist. Ein Weg, um das Problem zu umgehen, ist ein Leerzeichen nach dem ersten { hinzufügen, aber diese Art von manipulieren das Format. Was ist der richtige Weg, um { in Django Templates zu entkommen?

Antwort

12

Werfen Sie einen Blick auf die templatetag tag:

Ausgang eines der Syntaxzeichen verwendet Template-Tags zu komponieren.

Da das Template-System kein Konzept der „Flucht“ hat, eines des Bits in Template-Tags verwendet, um anzuzeigen, müssen Sie den {% templatetag %} Tag verwenden.

Was Sie sind nach its:

{% templatetag openvariable %} 

Vielleicht gibt es eine schönere Lösung ist, weil diese die Lesbarkeit nicht erhöht ...

3

Ein anderer (flexiblerer) Ansatz besteht darin, die Werte in einen bibtex-ähnlichen Wert zu konvertieren, bevor sie an Ihre Vorlage gesendet werden. Sie werden dies wahrscheinlich trotzdem tun müssen, um einigen der Charaktere zu entkommen, mit denen bibtex/latex nicht umgehen kann. Hier ist etwas ähnliches ich bereits vorbereitet:

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

Sie auch als Vorlage Filter verwenden könnte, wenn man wollte, so dass Ihre Vorlage wie folgt aussehen:

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

Aber ich würde den Inhalt entkommen, bevor es wird zu die Vorlage, so dass Ihre Vorlage nur dies tun muss:

Oder lassen Sie sogar die Vorlage insgesamt in diesem Stadium. Viel Glück!

+0

Danke! Hört sich interessant an - ich lerne immer noch Django/Python (bisher 8 Stunden Erfahrung), aber ich werde das untersuchen. – rxin