回答:
{% block javascript %}
{{ block.super }}
... more content ...
{% endblock %}
を使用block.super
すると、テンプレートを拡張するときはうまくいきますが、テンプレートを含めるときはうまくいきません。
{% extends "base.html" %} vs. {% include "partial.html" %}
ページの中央にテンプレートを含め、ページの最後のブロックにJavaScriptを追加したいとしますblock.super
。含まれているテンプレートを呼び出すとクラッシュします。
Cf. Djangoは#7324、#12008、#13399、およびドキュメントの関連する更新を発行します。Cf. タグのメモを含める:
includeタグは、「このサブテンプレートを解析して、親の一部であるかのようにコンテンツを含める」ではなく、「このサブテンプレートをレンダリングしてHTMLを含める」の実装と見なす必要があります。つまり、インクルードされたテンプレート間で状態が共有されることはありません。各インクルードは完全に独立したレンダリングプロセスです。
ブロックは含まれる前に評価されます。つまり、別のブロックを含むテンプレートには、既に評価およびレンダリングされたブロックが含まれます。たとえば、拡張テンプレートによってオーバーライドできるブロックは含まれません。
その場合、私はdjango-sekizaiを使用することをお勧めします。
{% load sekizai_tags %}
⎧ <p>Some content</p>
<p>Some content</p> | {% addtoblock "js" %}
| <script type="text/javascript">
{% include "partial.html" %} -> ⎨ alert("Hello django-sekizai");
| </script>
<p>Some more content</p> ⎩ {% endaddtoblock %}
{% render_block "js" %}
以下からのジャンゴ- sekizai README:
私がこのプロジェクトを始めた主な理由は、djangoとdjango-cmsに優れたメディア(css / js)フレームワークがないことでした。はい、djangoのフォームで使用されるMediaクラスがありますが、実際にはそれはうまく機能しません。通常、フロントエンドの人たちはcssファイルとjavascriptファイルを含めるかどうかを決定し、Pythonファイルを編集して変更する必要がないので、Pythonファイルを変更する必要もありません。そのため、現在の時点より前または後のテンプレートの内容を編集できるようにする必要がありました。また、重複を削除したかった。その結果、私はdjango-sekizaiを書きました。ブロックに似ていますが、継承するのではなく、拡張します。