5

Djangoテンプレートシステムの非常に奇妙な動作に遭遇しました。テンプレートファイルがあります。つまりtest.html、再帰的にそれ自体が含まれています。

{% include "test.html" %}

もちろん、仕上げ条件がないため、このようなテンプレートをレンダリングする機会はありません。OK、次のことを試してみましょう。

{% if test_false %}{% include "test.html" %}{% endif %},

ここで、test_falseはテンプレートに渡され、に等しい変数ですFalse

何も含まれないと予想されますが、次のようになります。

RuntimeError at /test/
maximum recursion depth exceeded while calling a Python object

理解できません。インクルードタグは現在のコンテキストから引数を取ることができるので、ページの他の部分の前に実行されるとは思えません。では、なぜ条件タグを無視するのでしょうか。

4

2 に答える 2

7

Djangoには、コンパイル時に定数によって与えられるテンプレートを含む最適化があります。

テンプレートの名前を変数に設定し、そのように含めます。

{% include test_template %}

Djangoはその最適化を使用できなくなり、コードは機能するはずです。

于 2012-06-08T14:19:55.293 に答える
1

Thomaszが言うように、Djangoは、パスがインクルードテンプレートで定数文字列として定義されている場合にのみ、この最適化を行うことができます。

{% include "test.html" %}

しかし、Pythonコードからのコンテキストにテンプレートパスを配置する必要はありません。

したがって、同じ結果を達成するためのもう少し自己完結型の方法があります-インクルードをwith:でラップします

{% with "test.html" as path %}
    {% include path %}
{% endwith %}
于 2016-05-31T16:04:59.700 に答える