避免来自Jinja2的含糊不清的胡须,包括jQuery模板

时间:2011-02-25 12:27:45

标签: jquery jinja2 jquery-templates

我正在尝试将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的变量开始和结束分隔符是不切实际的。此外,它令人困惑,降低了互操作性,并需要额外的培训。最好避免使用此选项。

所以我想到的两个替代方案是:

  1. Jinja2逃避每个'{{'和'}}',我不太确定如何做得最好(“{{”{{“}}`,也许,但这很冗长); < / p>

  2. 更实用 - 也许是理想的 - 会告诉Jinja2 解析一段代码,可能是通过jQuery扩展。

  3. 我很感激你的想法和反馈。谢谢你的阅读。

2 个答案:

答案 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