6

次のテンプレートがあるとします。

<!DOCTYPE html>    
<html>
    {{ var1 }}
    {% if var1 and var2 %}
        <span>some text</span>
    {% endif %}
    {{ var2 }}
</html>

var1=3コンテキストとしてレンダリングすると、次の出力が生成されます。

<!DOCTYPE html>    
<html>
    3
    {% if 3 and var2 %}
        <span>some text</span>
    {% endif %}
    {{ var2 }}
</html>

最初のレンダリングの出力をvar2=5コンテキストとして再度レンダリングすると、出力は次のようになります。

<!DOCTYPE html>    
<html>
    3
        <span>some text</span>
    5
</html>

問題は、ほとんどのテンプレート エンジンがコンテキストにない変数を空の文字列として評価することです。これらはすべて、レンダリングが 1 回しかないという前提で構築されています。

私は jinja2 がこの方法でこれを行うことができることを知っています: jinja2 テンプレートの複数のレンダリング?

ただし、ステートメント全体では機能しませんif。単一の変数に対してのみ機能します。

人気のあるテンプレート ライブラリには、私が説明したようなレンダリング モードがありますか? マコ?げんし?他の何か?これを行う非pythonテンプレートエンジンでしょうか?

4

2 に答える 2

6

TL;DR

この機能は、私が知っているどのテンプレート言語にも存在しません。あなたの最良の選択肢は次のとおりです。

  1. このSOの質問を使用してハックする
  2. 独自のテンプレート タグを記述します (以下を参照)。

独自のテンプレート タグを作成する

ここにはいくつかのオプションがあると思いますが、そのうちのいくつかはhereから取得しましたが、テンプレート システムの組み込み機能を含むものはありません。基本的に、ここでの目標は、再度レンダリングするテンプレート タグを含むものをレンダーに出力させることです。

私が見ているように、最も簡単なのはtemplatetagテンプレートタグを使用するか、同様のことを行い、エスケープを処理する独自のタグを作成することです。

var11 番目と2 番目を確実にレンダリングしていた場合var2:

<!DOCTYPE html>    
<html>
    {{ var1 }}
    {% templatetag openblock %} if {{ var1 }} and var2 {% templatetag closeblock %}
        <span>some text</span>
    {% templatetag openblock %} endif {% templatetag closeblock %}
    {% templatetag openvariable %} var2 {% templatetag closevariable %}
</html>

最初のレンダリングでは、次のようになります。

<!DOCTYPE html>    
<html>
    {{ 3 }}
    {% if 3 and var2 %}
        <span>some text</span>
    {% endif %}
    {{ var2 }}
</html>

これにより、2 回目のレンダリングで目的の出力が得られます。

明らかに、常に複数のレイヤーを作成するの{% templatetag %}は非常に面倒なので、これを処理する独自の再帰的なテンプレート タグを作成することをお勧めします。おそらく、必要なネストのレイヤー数を指定する引数を使用します。 、そして明らかに入力自体の引数です。これの良いところは、入れ子のレイヤーが 1 つだけ必要な場合、テンプレート タグで入力を出力するだけでうまくいくことです。

基本的に、このカスタム テンプレート タグ自体を再帰的に出力することで、必要な数のネスト レイヤーを非常に簡単に実現できます。タグが次のように実装されていると仮定し{% t <layers of nesting> <input> %}ます。

    初期テンプレート: {% t 2 "{{ var2 }}" %}
    最初のレンダリング: {% t 1 "{{ var2 }}" %}
    2 番目のレンダリング: {{ var2 }}
    最終レンダリング: 5

{% if %}確かに、特にあなたの例のように、単一の if ステートメント内で必要なレンダリングの複数のレイヤーがある場合、これはより複雑なタグの一部ではより困難になります。ここでは、if ステートメントを分割して、レンダリングをより明確に分離できるようにすることをお勧めします。次の例では、 /の組み合わせである{% t %}タグの実装を想定しています。{% t %}{% endt %}

初期 HTML:

{% if var1 %}
   {% t 1 %}
       {% if var2 %}
          <span>some text</span>
       {% endif %}
   {% endt %}
{% endif %}

最初のレンダリング:

{# Note that the first if statement has been evaluated and is gone #}
{% if var2 %}
    <span>some text</span>
{% endif %}

最終レンダリング:

<span>some text</span>
于 2012-12-27T21:26:42.753 に答える