2010-02-02 1 views
15

Dla nowego projektu piszemy dokumentację o systemie z Django o numerze:. Używamy Django również do samego projektu dokumentacji, więc Django odbiera wszystkie przykładowe zmienne w przykładowym kodzie i próbuje je renderować. Jedynym sposobem, który udało nam się obejść, jest użycie {% templatetag %}, ale to sprawia, że ​​nasz kod jest naprawdę nieczytelny. Czy istnieje sposób, aby Django zignorował wszystkie zmienne szablonów w określonej sekcji?Łatwy sposób na ucieczkę Zmienne szablonu Django

+0

+1 - Dobre pytanie. Ja też chciałbym znać odpowiedź. – sberry

Odpowiedz

7

Z powodu ograniczeń w lexer szablon Django (jak bycie kludgy hack), jest to niemożliwe. Jednakże, jeśli są chętni, aby umieścić swój przykładowy kod w osobnych plikach, można użyć ssi tag:

{% ssi /path/to/my/code/examples/example01.html %} 

I to nie będzie analizować plik, wystarczy umieścić go dosłownie. Ma to jednak również ograniczenia polegające na tym, że nie możesz używać zmiennych w ścieżce dołączania (tzn. Jeśli przenosisz lokalizacje szablonów, musisz przepisać lub przynajmniej znaleźć i zastąpić pliki szablonów) i musisz umieścić w nich ścieżka (tj. /path/to/my/code/examples) w ustawieniu ALLOWED_INCLUDE_ROOTS w swoim settings.py. (Patrz: http://docs.djangoproject.com/en/dev/ref/templates/builtins/#ssi.)

+2

+1 dla "jak bycie kludgy hack". –

+1

Ha, naszym początkowym rozwiązaniem było zrobienie tego z ajaxem, lub użycie "[" zamiast "{" i zastąpienie ich z javascript. Jeśli nikt nie wymyśli czegoś lepszego, to chyba na to odpowiedziałeś. –

+0

Podoba mi się twój pomysł "" ["i zamiana z JS". – lawrence

3

Możliwe jest pisanie szablonów jak zwykle (z {{ x }}), ale zapisanie ich jako .txt (lub dowolnego innego rozszerzenia, które chcesz). Napisz skrypt uruchamiający te pliki i automatycznie utworzy dla ciebie .html, wykonując odwrotność templatetag (zastępując {{ z {% templatetag openvariable %} itp.). Upewnij się, że kod działa po aktualizacji szablonów.

3

Rozwiązałem to, dodając znacznik szablonu "include_raw", który zachowuje się jak wbudowany znacznik "include", ale po prostu nie analizuje ani nie przetwarza przesłanego do niego pliku. Używam Django 1.2 w App Engine.

Utwórz moduł Tagi (tags.py):

from django.template import loader 
from google.appengine.ext.webapp import template 

register = template.create_template_register() 

@register.simple_tag 
def include_raw(path): 
    return loader.find_template(path)[0] 

zarejestrować go:

from google.appengine.ext.webapp import template 

template.register_template_library("tags") 

Użyj go:

{% include_raw "this-will-be-included-verbatim.html" %} 
3

Jeśli źródło jest HTML, najprostszym rozwiązaniem będzie zastąpić "{" i "}" ich odpowiednimi jednostkami HTML:

{ się {

} się }

przykład:

<code> 
To include some other file, you can use the &#123;% include %&#125; template tag. 
To include a variable, use &#123;%&#123;% varname &#125;%&#125;%. 
</code> 
14

Django 1,5 rozwiązuje ten problem za pomocą znacznika verbatim formy:

{% verbatim myblock %} 
    Avoid template rendering via the {% verbatim %}{% endverbatim %} block. 
{% endverbatim myblock %} 
0

Oto elegancki sposób rozwiązać problem dla Djan o 1.4. Jest to niestandardowy tag Django. Po prostu stwórz moduł verbatim_templatetag.py zawierający następujący kod:

""" 
jQuery templates use constructs like: 

    {{if condition}} print something{{/if}} 

This, of course, completely screws up Django templates, 
because Django thinks {{ and }} mean something. 

Wrap {% verbatim %} and {% endverbatim %} around those 
blocks of jQuery templates and this will try its best 
to output the contents with no changes. 
""" 

from django import template 

register = template.Library() 


class VerbatimNode(template.Node): 

    def __init__(self, text): 
     self.text = text 

    def render(self, context): 
     return self.text 


@register.tag 
def verbatim(parser, token): 
    text = [] 
    while 1: 
     token = parser.tokens.pop(0) 
     if token.contents == 'endverbatim': 
      break 
     if token.token_type == template.TOKEN_VAR: 
      text.append('{{') 
     elif token.token_type == template.TOKEN_BLOCK: 
      text.append('{%') 
     text.append(token.contents) 
     if token.token_type == template.TOKEN_VAR: 
      text.append('}}') 
     elif token.token_type == template.TOKEN_BLOCK: 
      text.append('%}') 
    return VerbatimNode(''.join(text)) 

Następnie w szablonie {obciążenie% verbatim_templatetag%}

wszystko między {% verbatim%} i {%}% endverbatim nie będzie analizowana.

Kod z https://gist.github.com/ericflo/629508