2011-02-25 133 views
26

我试图将jQuery templates插入到Jinja2模板中。唉他们都(默认设置)使用胡须{{ & }}分别表示表达式和文字。避免Jinja2中包含jQuery模板的模糊胡须

我将我的jQuery模板到HTML与script标签,就像这样:

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

如果以上是在神社模板,但是,它不太愿意,因为神社试图解释each为文字。

在这种情况下(我们已经有很多模板了),改变Jinja2的变量开始和结束分隔符是不现实的。另外它很混乱,降低了互操作性,并且需要额外的培训。最好避免这个选项。

所以两个备选事情我已经想到了解决这个有:

  1. 逃逸的Jinja2每个“{{”和“}”,这我不太知道怎么做最好(“{{ ”{{“}}`,也许,但是这是冗长);

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

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

+3

我也有一个模糊的小胡子!提醒我该刮脸了。 :) – 2011-02-26 15:09:07

回答

51

您可以使用{% 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> 
+4

虽然转义和块转义是好的,但我得出的结论是,最好的办法是确保服务器分隔符全部独占于服务器,并且客户端分隔符全部独占于客户端,因此零需要转义。 看来这是可行的,通过配置服务器模板引擎来使用您自己的自定义分隔符。 这使得人们可以自由选择服务器和客户端模板,而不会有逃脱的问题。 另外需要注意的是,应该确保两个引擎不会与JavaScript或其他客户端编码冲突。 – iJames 2012-11-15 21:12:10

+0

我不知道我是否需要它,但我希望可以在Handlebars模板中使用Jinja2功能。但是,相反,如果能够在服务器和客户端上使用相同的语言,我就可以在服务器上呈现默认版本,然后使用相同的模板让客户端进行更新。 – 2015-10-14 16:06:56

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

+0

我一直在寻找这个问题的各种解决方案,今天晚上你的是迄今为止最优雅的,并具有与Jasmine和Karma单元测试良好玩的巨大好处。谢谢!! – 2015-05-25 22:45:13