29

jQueryテンプレートJinja2テンプレートに挿入しようとしています。残念ながら、どちらも(デフォルトの設定では)口ひげを使用して、それぞれ式{{}}リテラルを示しています。

script次のように、jQueryテンプレートをタグ付きのHTMLに挿入しています。

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

ただし、上記がJinjaテンプレートに含まれている場合、Jinjaはeachリテラルとして解釈しようとするため、失敗します。

状況によっては(すでに多くのテンプレートがあります)、変数のJinja2の開始区切り文字と終了区切り文字を変更することは実用的ではありません。さらに、混乱を招き、相互運用性が低下し、追加のトレーニングが必要になります。このオプションは避けることが望ましいです。

したがって、これを解決するために私が考えた2つの代替案は次のとおりです。

  1. Jinja2はそれぞれの'{{'と'}}'をエスケープしますが、これは最善の方法がよくわかりません( "{{" {{"}}`、おそらく、それは冗長です)。

  2. より実用的(おそらく理想的)は、おそらくjQuery拡張機能を介して、コードのブロックを解析しないようにJinja2に指示することです。

考えやフィードバックをいただければ幸いです。読んでくれてありがとう。

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 に答える