web-dev-qa-db-ja.com

django別のアプリのテンプレートを含める

プロジェクトを設定し、アプリを非依存に保つために作業している間に、私はひっかかった。さまざまなアプリのすべてのテンプレートに、一貫したヘッダーとフッターが必要です。私がしようとしているものは次のとおりです。

myproject/
         base/
             templates/
                      header.html
                      footer.html
         app1/
             templates/
                      my_app1_page.html -> want to include 'header.html'
                                           and 'footer.html' from base app

これを実行したいアプリが他にもたくさんあります。これは可能ですか、それとも正しい方法ですか?

56
Scott

アプリがINSTALLED_APPSにあり、アプリのテンプレートローダーが有効になっている限り、別のアプリのテンプレートを含めることができます。

{% include "header.html" %}

...テンプレートはアプリのテンプレートディレクトリに直接配置されるためです。一般的に、名前の衝突を避けるために、以下を使用することをお勧めします。

app1/
    templates/
        app1/
            page1.html
            page2.html
app2/
    templates/
        app2/
            page1.html
            page2.html

{% include "app1/page1.html" %}または{% include "app2/page1.html" %} ...

ただし:一貫したルックアンドフィールを維持するには、インクルードするよりもテンプレートの継承を使用する方がはるかに優れています。テンプレートの継承は、本当に良いこと Djangoテンプレートシステムの1つです。意味のある場合は常に、インクルージョンよりも継承を選択します(ほとんどの場合)。

私の推奨事項:

  • ヘッダーとフッター、およびメインコンテンツ用の{%block content%}を含むプロジェクトのベーステンプレート( "base.html"がデフォルトの規則です)を用意します。
  • 他のテンプレートにbase.html {% extends "base.html" %}フォームを継承させ、コンテンツセクションをオーバーライドします

ドキュメントへのリンクについては、この質問に対する別の回答をご覧ください

91

include tag を使用して絶対パスを指定することで確かにそれを行うことができますが、Djangoで作業する適切な方法は Template inheritance を使用することです=。

9
Tiago