django包含来自另一个应用程序的模板

Sco*_*ott 56 django templates

在设置我的项目并努力使应用程序不依赖时,我遇到了麻烦.我希望来自不同应用程序的所有模板都具有一致的页眉和页脚.这是我正在尝试的:

myproject/
         base/
             templates/
                      header.html
                      footer.html
         app1/
             templates/
                      my_app1_page.html -> want to include 'header.html'
                                           and 'footer.html' from base app
Run Code Online (Sandbox Code Playgroud)

假装有更多的应用程序也想要这样做.这是可能的和/或正确的方法吗?

Car*_*bés 92

只要应用程序处于INSTALLED_APPS并且启用了应用程序目录的模板加载程序,您就可以包含来自其他应用程序的任何模板,即:

{% include "header.html" %}
Run Code Online (Sandbox Code Playgroud)

...因为您的模板直接位于应用的模板目录中.通常,为了避免名称冲突,最好使用:

app1/
    templates/
        app1/
            page1.html
            page2.html
app2/
    templates/
        app2/
            page1.html
            page2.html
Run Code Online (Sandbox Code Playgroud)

{% include "app1/page1.html" %}{% include "app2/page1.html" %}...

但是:为了保持一致的外观和感觉,使用模板继承而不是包含更好.模板继承是Django模板系统真正优秀的东西之一,只要有意义(大多数时候)选择继承而不是包含.

我的建议:

  • 为您的项目创建一个基本模板("base.html"是默认约定),包含页眉和页脚以及{%block content%}主要内容.
  • 让您的其他模板继承形式base.html {% extends "base.html" %}并覆盖内容部分

有关该文档的链接,请参阅此问题的其他回复

  • 我只是想为那些可能认为包含功能不好的 Django 新手扩展一点建议:虽然我同意,利用继承确实很好,但说它比包含更好并不完全正确选项。它只是有不同的目的。它是处理较小 html 片段(如 Wordpress 等流行 cms 中的模块/小部件)的好工具。例如,您可能希望在第二个应用程序中列出博客中的所有类别 - 如果没有 {% include %} 选项,您可能会意识到您必须在两个应用程序中重写相同的代码。 (2认同)

Tia*_*ago 9

虽然您可以通过使用include标记和指定绝对路径来实现这一点,但在Django中工作的正确方法是使用模板继承.

  • 如果我有一些模型和部分模板来呈现该模型 - 例如地址、事件怎么办?我认为,在这种情况下,这种包容是有意义的。 (2认同)