2012-08-23 3 views
25

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

私は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 %} 

私はどこにでもそれが必要だった。このような何かをしなければなりませんでした。

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

+0

あなたのdjangoバージョンは何ですか? –

+0

も参照してください。http://stackoverflow.com/questions/942797/why-cant-i-nest-a-block-tag-inside-an-if-tag – Bryce

+0

ありがとう私はこれ以上頭を打ちました – pmont

答えて

13

あなたは間違いをしませんでした。テンプレートブロックは、周囲の条件に関係なく含まれています。あなたはDjango source codedjango/template/loader_tags.pyExtendsNodeクラスのこの行からこれを見ることができます:

self.blocks = dict([(n.name, n) for n in nodelist.get_nodes_by_type(BlockNode)]) 

{% extends %}がレンダリングされている場合は、親は全体の来るとき、それは直接テンプレートからすべてのブロックのノードを取得し、レンダリングのためにそれらを保存しますそれらはblockです。子供のブロックが条件付きであるかどうかは考慮されません。

+0

このための回避策はありますか? – jsmedmar

関連する問題