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

假设有更多的应用程序也想这样做。这种方法可行吗?

44809 次浏览

当然,您可以通过使用 包括标签并指定绝对路径来实现这一点,但是在 Django 中的正确方法是使用 模板继承

只要应用程序在 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 模板系统的 非常好的事情之一,只要有意义(大多数时候)就选择继承而不是包含。

我的建议是:

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

有关文档的链接,请参见对此问题的另一个回答

如果您使用“ $django-admin startproject project”启动一个项目,则会创建一个名为“ project-file-name”的文件夹,即 project/。在添加了一些应用程序并在“ setings.py”-> INSTALLED _ APPS = [ ... ,app1,app2]中添加了应用程序并在项目中创建了一个模板文件夹之后,我得到了这样的结构:

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

在模板 app1/template/page1.html 中

{% extends 'base.html' %}

and the "TemplateDoesNotExist at /" Error message appeared.

Then I added another App named "core" and added base.html to the template folder (+edit INSTALLED_APPS in settings.py) and i got this structure now:

project/
project/
templates/    (unused)
base.html (not seen)
core/
templates/
base.html
app1/
templates/
app1/
page1.html
page2.html
[...]

现在,错误消息消失了,并且在 template/app1/page1.html 中找到了 base.html:

{% extends 'base.html' %}

您可以像下面这样更改文件夹结构:

    core/
templates/
core/
base.html

然后需要将模板 app1/page1.html 更改为

{% extends 'core/base.html' %}

我也是。

作为一个替代方案,你也可以像下面这样在你的设置文件中添加解释“ project”中的“ your-project-name”:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'project', # your project name main folder
'core',
'App1',
'App2',
]

现在 django 也找到了 project/template/base.html,但是我不知道是否推荐这种解决方案。

project/
project/
templates/
base.html (now it is found)

附注: 谢谢(我的赞成票还没有计算) ,如果这个答案是明确和可以理解的,请评论我