32

djangoテンプレートのif条件内のブロックを呼び出そうとしています。

私は持っていbase templateます。基本テンプレートを拡張する他の多くのテンプレートがあります。ベーステンプレートでブロックを定義しました:

{% block test_block %}Test{% endblock %}

次に、他のテンプレートの特定の条件でこのブロックをオーバーライドします。条件が失敗した場合、ブロックはオーバーライドされるべきではありません。これは私が書いたものです:

{% if test_value %}{% block test_block %}Development{% endblock %}{% endif %}

これは実際には(または事実上)if条件を無視します。

私がついにしたこと:

{% block test_block %}{% if test_value %}Development{% else %}{{ block.super }}{% endif %}{% endblock %}

私はそれが必要とされるところならどこでもこのようなことをしなければなりませんでした。

これが最善の方法ですか?これが唯一の方法ですか?なぜ私は私の最初の方法を試すことができないのですか?それとも私の側から何か間違いがありますか?

4

1 に答える 1

21

間違いはありません。テンプレートブロックは、周囲の条件に関係なく含まれています。これは、DjangoソースコードExtendsNodeのクラスのこの行から確認できます。django/template/loader_tags.py

self.blocks = {n.name: n for n in nodelist.get_nodes_by_type(BlockNode)]}

がレンダリングされるとき{% extends %}、テンプレートからすべてのブロックノードを直接フェッチし、親がそれらに遭遇したときにレンダリングのためにそれらを保存しますblock。子のこれらのブロックが条件文の内部にあるかどうかは考慮されません。

于 2014-03-22T23:16:53.507 に答える