TL;DR
この機能は、私が知っているどのテンプレート言語にも存在しません。あなたの最良の選択肢は次のとおりです。
- このSOの質問を使用してハックする
- 独自のテンプレート タグを記述します (以下を参照)。
独自のテンプレート タグを作成する
ここにはいくつかのオプションがあると思いますが、そのうちのいくつかはhereから取得しましたが、テンプレート システムの組み込み機能を含むものはありません。基本的に、ここでの目標は、再度レンダリングするテンプレート タグを含むものをレンダーに出力させることです。
私が見ているように、最も簡単なのはtemplatetag
テンプレートタグを使用するか、同様のことを行い、エスケープを処理する独自のタグを作成することです。
var1
1 番目と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>