我正在尝试将jQuery templates插入Jinja2模板中。唉,他们(在默认设置中)都使用胡须{{
& }}
分别表示表达式和文字。
我正在使用script
标记将我的jQuery模板插入到HTML中,如下所示:
<script type='text/x-jquery-template'>
<div>The people are:
{{ each people }}
${$value}
{{ /each }}
</div>
</script>
如果以上是在Jinja模板中,那么它会因为Jinja试图将each
解释为文字而贬低。
在这种情况下(我们已经有很多模板),改变Jinja2的变量开始和结束分隔符是不切实际的。此外,它令人困惑,降低了互操作性,并需要额外的培训。最好避免使用此选项。
所以我想到的两个替代方案是:
Jinja2逃避每个'{{'和'}}',我不太确定如何做得最好(“{{”{{“}}`,也许,但这很冗长); < / p>
更实用 - 也许是理想的 - 会告诉Jinja2 不解析一段代码,可能是通过jQuery扩展。
我很感激你的想法和反馈。谢谢你的阅读。
答案 0 :(得分:54)
您可以使用{% raw %}{% endraw %}
构造来缓解您的逃避问题(直接来自Jinja2 docs)。
示例:
<script type='text/x-jquery-template'>
<div>The people are:
{% raw %}<!-- Everything in here will be left untouched by Jinja2 -->
{{ each people }}
${$value}
{{ /each }}
{% endraw %}
</div>
</script>
答案 1 :(得分:3)
我在尝试使用聚合物时通过谷歌找到了这个,但不喜欢提出的解决方案,所以另一个选择:使用过滤器。
在你的python代码中定义一个过滤器:
#Filter to create curly braces
@app.template_filter('curly')
def curly(value):
#Handle value as string {{'foo'|curly}}
if(isinstance(value,str)):
return_value = value
#Handle value directly. {{foo|curly}}
else:
return_value = value._undefined_name
return "{{" + return_value + "}}"
然后在您的模板中,您可以使用{{'foo'|curly}}
或{{foo|curly}}
PS:如果你不使用烧瓶,我认为你不能使用装饰器,但必须明确注册过滤器:environment.filters['curly'] = curly
。