29

我正在尝试将jQuery 模板插入Jinja2模板。唉,它们(在默认设置中)都使用小胡子{{&}}分别表示表达式和文字。

我将我的 jQuery 模板插入带有script标签的 HTML 中,如下所示:

<script type='text/x-jquery-template'>
    <div>The people are:
         {{ each people }} 
          ${$value}
         {{ /each }}
    </div>
</script>

但是,如果上面的内容在 Jinja 模板中,它就会犹豫,因为 Jinja 试图解释each为文字。

在这种情况下(我们已经有很多模板),更改 Jinja2 的变量的开始和结束分隔符是不切实际的。此外,它令人困惑,降低了互操作性,并且需要额外的培训。最好避免使用此选项。

所以我想解决这个问题的两个替代方法是:

  1. Jinja2 转义每个 '{{' 和 '}}',我不太确定如何做到最好(也许是“{{ “{{” }}`,但这很冗长);

  2. 更实际的——也许是理想的——告诉 Jinja2不要解析代码块,也许是通过 jQuery 扩展。

我会很感激你的想法和反馈。感谢您的阅读。

4

2 回答 2

56

您可以使用该{% raw %}{% endraw %}构造来缓解逃避困境(直接来自Jinja2 文档)。

例子:

<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>
于 2011-02-28T00:31:52.040 回答
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.

于 2015-04-04T20:31:12.343 回答