上書きするのではなく、{%block%}に追加できますか?


116

私のcore.htmlには、javascriptというラベルの付いたブロックがあります。このブロックにすべてを上書きせずに、このブロックにさらに行を追加できればすばらしいと思います。

回答:



9

を使用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を書きました。ブロックに似ていますが、継承するのではなく、拡張します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.