13

私の友人と私は小さな口論をしています。私の現在の Django プロジェクトでは、menu.html という名前のファイルを作成しました。このファイルには、リストに構成およびフォーマットされた一連のリンクが含まれます。メニューを各ページに手動でハードコーディングする代わりに、現在、次の Django/Python コードを使用してメニューを含めています。

{% include 'menu.html' %}

しかし、私の友人は、これは間違ったやり方だと言っています。彼は、インクルードの代わりに extends を使用してから、次のようにコンテンツを定義する必要があると言いました。

{% extend 'menu.html' %}
{% block content %}
The rest of my content here.
{% endblock %}

それは少し余分なコードです。どちらを使用するかは本当に重要ですか? 私は前者を使用することを好みます。

4

3 に答える 3

14

はい、それは重要です。まず第一にextends、ファイルの最初の行としてのみ発生する可能性があります。次に、include解決スタックでコンテキスト オブジェクトをプッシュおよびポップします。つまり、インクルード中にコンテキストで作成された値は、返されると範囲外になります。

私のルールは次のとおりです。サイトの全体的な構造を定義するテンプレート ファイルを作成し、重要な領域の周りに十分base.htmlな量を使用します。{% block foo %}次に、他のすべてのテンプレートextendsをベース (またはそれ自体がベースを拡張するもの) にし、必要に応じてそれらのブロックを置き換えます。

include一方、複数の場所、場合によっては同じページで使用する必要があるものをカプセル化するのに適しています。

アップデート:

私は自分自身の のライブラリをtemplate_tags長い間使用してきたので、Django のテンプレート言語にはまだ機能に大きなギャップがあることを忘れています。ここで問題となっているタグは、expr私が大幅に編集および拡張した初期の django スニペットからのものです。たとえば、 (または任意の有効な Python 式) と言うと、現在の Context{% expr 'Fred' as name %}の 'name' スロットに結果が格納されます。これがテンプレートで発生した場合、の値はテンプレート ファイルの終了時にポップされます。includedname

{% with %}タグを使用してこれを実現することもできますが、expr任意の複雑な呼び出しを行うなど、はるかに高い柔軟性が得られます。これはもともと、高価な DBMS とのやり取りを必要とする複雑なキャッシュ オブジェクトを作成する必要があり、ビューでは実行できず、テンプレート自体で呼び出す必要があったときに発生しました。

これについて詳しく知りたい場合は、(私のプロフィールで) 私に電子メールを送ってください。

于 2010-02-24T01:31:33.353 に答える
3

( 彼の友達 )

私が実際に意味したのはbase.html、いくつかの一般的なセクションから一貫した基本テンプレートを継承できるように を定義することでした。これには doctype が含まれ、html 要素は、コンテンツとナビゲーションの 3 つのブロックを定義し、ヘッドにスクリプト/リンク要素をオーバーライド/挿入するためのオプション領域を定義します。

<!doctype>
<html>
<head>
{%block extrahead %} {%endblock %}
</head>
{%block nav %}
<nav>
  <ul>
    <li>home</li>
  </ul>
</nav>
<div id="content">
{% endblock %}
{%block content %}
{% endblock %}
</div>
</html>

次に、次を定義できますhomepage.html

{% extends "base.html" %}

{% block content %}
homepage content
{% endblock %}

homepage.html拡張するため、ナビゲーションが表示されますbase.html

于 2010-02-24T01:32:13.620 に答える
2

この場合、メニューを配置してbase.htmlこれから拡張する方が理にかなっているようです。

including複雑なテンプレートを分割し、それらのチャンクを再利用するのに最適です。

サイトのさまざまな場所で同じリスト スタイルを使用しているが、別のクエリセットを送信しているとします。クエリセットを同じように呼び出す限り、テンプレート コードを 1 回記述するだけで済みます。

ここでは、通常のリクエストと ajax リクエストに異なるテンプレートを使用します。ただし、インクルードを使用すると、両方のテンプレートのほとんどの部分を再利用できます

于 2010-02-24T07:18:23.620 に答える