如何在django模板中转义{{或}}?

时间:2011-10-14 18:33:13

标签: python django

Django将{{ var }}视为其模板中的某个变量。如何逃离{{ var }}{{}},以免django将其视为变量。

<p>"{{ some text }}"</p>应该打印完全一样。

10 个答案:

答案 0 :(得分:124)

Django 1.5引入了{% verbatim %}模板标签。它会阻止模板解析此标记的内容:

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

将呈现为:

{{ var }}

答案 1 :(得分:60)

我相信您正在寻找templatetag模板标记。

正如链接文档所述,

  

由于模板系统没有“转义”的概念,要显示模板标签中使用的其中一个位,您必须使用{% templatetag %}标签。

例如:

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

将如此显示:

<p>"{{ some text }}"</p>

答案 2 :(得分:25)

编辑:我不是真的推荐这个,因为它不是很干净,但它仍然是一个选项。

我正在搜索一个可以与JQuery模板一起使用的方法,并找到了一种无需标签或过滤器的方法。这是我能得到的简短:

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

打印为:

{{ any text }}

为什么会有效? {{}}中的任何文字都会按原样显示,只要它连续没有两个结束括号}}。然后连续有三个括号,django将两个第一个括号解释为变量的结尾,留下一个额外的右括号。

答案 3 :(得分:11)

您可以尝试使用html字符转义转义,例如:

{= &#123;

} = &#125;

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

在浏览器中试试。

答案 4 :(得分:7)

如果你只需要使用{{}}作为像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目录

答案 5 :(得分:3)

虽然上面的答案可以解决原来的问题,但我在这里为那些像我一样挠头的人添加了一些黑客。

有时,我们想要渲染一个大括号后跟一个变量。例如,在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}
}

那些围兜字段来自模板变量。如果你写

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

这看起来很笨拙,但它是迄今为止我发现的最好的。如果您有更清洁的解决方案,请告诉我。

答案 6 :(得分:2)

另一种选择是在每个花括号之间添加word joiner(零宽度不间断空格):

<p>"{&#8288;{ some text }&#8288;}"</p>

答案 7 :(得分:2)

This template tag(专为与jQuery模板一起使用而设计)可能会有所帮助。它允许你包装你不希望Django用模板标签解释为变量的内容。

答案 8 :(得分:1)

Jinja,这是用于模板的内容,提供了几个有关转义的建议here.对我来说最有用的是"{% raw %}{{ some text }}{% endraw %}"

答案 9 :(得分:1)

它可以通过避免相邻的角度反馈来解决,如果它的内部javascript代码那么你可以写

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

我用它将jinja变量打印到另一个模板中,使用javascript。