Как выйти из {{или}} в шаблоне Django? - PullRequest
57 голосов
/ 14 октября 2011

Django рассматривает {{ var }} как некоторую переменную в своем шаблоне.Как я могу избежать {{ var }} или {{ или }}, чтобы django не рассматривал его как переменную.

<p>"{{ some text }}"</p> Должен печатать точно так же.

Ответы [ 10 ]

125 голосов
/ 10 января 2013

Введен Django 1.5 {% verbatim %} тег шаблона.Он не позволяет шаблону анализировать содержимое этого тега:

{% verbatim %}
    {{ var }}
{% endverbatim %}

будет отображаться как:

{{ var }}
60 голосов
/ 14 октября 2011

Я полагаю, что вы ищете шаблонный тег templatetag.

Как указано в документах, связанных с документом,

Поскольку система шаблоновбез понятия «экранирование», чтобы отобразить один из битов, используемых в тегах шаблона, необходимо использовать тег {% templatetag %}.

Например:

<p>"{% templatetag openvariable %} some text {% templatetag closevariable %}"</p>

появитсякак так:

<p>"{{ some text }}"</p>
25 голосов
/ 11 апреля 2012

Редактировать: Я действительно не рекомендовал это, потому что это не очень чисто, но это все еще вариант.

Я искал тот, который мог бы использовать с JQuery Templates и нашел способ сделать это без тегов или фильтров. Это так коротко, как я мог бы получить:

{{ "{{ any text }" }}}

печатается как:

{{ any text }}

Почему это работает? Любой текст в {{}} отображается как есть, если у него нет двух закрывающих скобок}} в строке. Затем в строке три скобки, django интерпретирует две первые как конец переменной, оставляя одну дополнительную закрывающую скобку.

11 голосов
/ 14 октября 2011

Вы можете попробовать экранировать с помощью экранирования html символов, например:

{= &#123;

} = &#125;

<p>"&#123;&#123; some text &#125;&#125;"</p>

Попробуйте это в своем браузере.

7 голосов
/ 27 октября 2014

если вам просто нужно использовать {{}} в качестве переменной для шаблонной структуры, такой как angularjs, тогда следующее может быть проще:

в вашем <app path>/templatetags/ngvar.py, добавьте

from django import template
register = template.Library()

@register.simple_tag
def ngvar(var_name):
    return "{{%s}}" % var_name

и в шаблоне, сделайте

{% load ngvar %}
{% ngvar "variable name" %}

если ngvar.py является первым тегом шаблона, обязательно добавьте файл __init__.py в каталог templatetags

3 голосов
/ 16 июня 2013

Хотя вышеприведенные ответы могут решить исходную проблему, я добавляю здесь хак для тех, кто почесывает голову, как я.

Иногда мы хотим отобразить одну фигурную скобку с последующей переменной.Например, в BibTeX может быть что-то похожее на это:

@MISC{hu2012-spectral,
    author = {Hu, Pili},
    title = {Spectral Clustering Survey},
    howpublished = {GitHub, https://github.com/hupili/tutorial/tree/master/spectral-clustering},
    month = {May},
    year = {2012}
}

Эти поля bib происходят из переменных шаблона.Если вы напишите

title = {{{title}}},

, jinja не сможет скомпилировать и выдать ошибку.Если вы напишите

title = { {{title}} },

, будут дополнительные пробелы.Хакерство заключается в том, чтобы хранить '{' и '}' как переменные и использовать их позже.

{% set lb = '{' %}
{% set rb = '}' %}
...
@MISC{{lb}}{{ meta.bib_key }},
    author = {{lb}}Hu, Pili{{rb}},
    title = {{lb}}{{ meta.title }}{{rb}},
    howpublished = {{lb}}GitHub, https://github.com/hupili/tutorial/tree/master/{{ auto.path}}{{rb}},
    month = {{lb}}{{ meta.month }}{{rb}},
    year = {{lb}}{{ meta.year }}{{rb}}
}

Это выглядит неуклюже, но это лучшее, что я нашел до сих пор.Если у вас есть более чистое решение, пожалуйста, скажите мне.

2 голосов
/ 15 октября 2011

Этот шаблонный тег (разработанный для использования с шаблонами jQuery) может помочь.Это позволяет вам оборачивать содержимое, которое вы не хотите, чтобы Django интерпретировал как переменные, с помощью тега шаблона.

2 голосов
/ 14 октября 2011

Другим вариантом будет добавление слова соединения (без пробела нулевой ширины) между каждой фигурной скобкой:

<p>"{&#8288;{ some text }&#8288;}"</p>
1 голос
/ 30 октября 2015

это можно решить, избегая смежных угловых задников, если он находится внутри кода javascript, то вы можете написать

'{'+'{address.'+key+'}}'

Я использовал это для печати переменных jinja в другой шаблон, используя javascript.

1 голос
/ 11 июля 2014

Джинджа, который используется для шаблонов, предлагает несколько советов по экранированию здесь. Для меня лучше всего использовать что-то вроде "{% raw %}{{ some text }}{% endraw %}"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...