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
Odpowiedz
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.)
+1 dla "jak bycie kludgy hack". –
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ś. –
Podoba mi się twój pomysł "" ["i zamiana z JS". – lawrence
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.
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" %}
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 {% include %} template tag.
To include a variable, use {%{% varname }%}%.
</code>
Django 1,5 rozwiązuje ten problem za pomocą znacznika verbatim formy:
{% verbatim myblock %}
Avoid template rendering via the {% verbatim %}{% endverbatim %} block.
{% endverbatim myblock %}
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.
+1 - Dobre pytanie. Ja też chciałbym znać odpowiedź. – sberry