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

Django 将 {{ var }}视为其模板中的某个变量。如何转义 {{ var }}{{}},使 django 不将其视为变量。

指纹应该完全一样。

36884 次浏览

我相信你正在寻找的 templatetag模板标签。

正如链接到文档中所说,

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

例如:

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

会显示如下:

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

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

{ = &#123;

= &#125;

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

在你的浏览器里试试。

另一个选项是在每个花括号之间添加一个 字体连接器(零宽度不可中断空格) :

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

这个模板标记 (专为与 jQuery Template 一起使用而设计)可能可以解决这个问题。它允许您用模板标记包装您不希望 Django 将其解释为变量的内容。

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

我一直在寻找一种可以用于 JQuery 模板的方法,并且找到了一种不需要标记或过滤器的方法。这是我能找到的最短的了:

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

印刷方式如下:

\{\{ any text }}

为什么会有用? \{\{}}中的任何文本都按原样显示,只要它在一行中没有两个大括号}}。然后在一行中有三个括号,django 将前两个括号解释为变量的结尾,留下一个附加的结束括号。

Django 1.5引入了 {% verbatim %}模板标签,它阻止模板解析这个标签的内容:

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

表示为:

\{\{ var }}

虽然上面的答案可以解决原来的问题,但是我在这里为那些像我一样摸不着头脑的人增加了一些技巧。

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

这看起来很笨拙,但这是我迄今为止找到的最好的。如果你有更干净的解决方案,请告诉我。

金贾,这是什么正在使用的模板,提供了几个建议,以逃避 给你。什么是最适合我的是使用类似于 "{% raw %}\{\{ some text }}{% endraw %}"的东西

如果您只是需要使用\{\{}}作为模板框架(如 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目录

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

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

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