Django同一项目中跨应用复用HTML模板的实现问题
核心原因
你遇到的问题是Django模板查找机制导致的:默认情况下,Django会优先在当前应用的templates目录下查找模板,所以你写{% extends "shared/base.html" %}时,它会去user/templates/shared/或accounting/templates/shared/找,而不是你创建的Shared应用里的模板。
解决方案一:规范应用模板结构(推荐)
这是最符合Django模块化设计的方式,无需修改配置,只需调整目录结构:
调整Shared应用的模板目录结构
把Shared应用的base.html放在templates/shared/子目录下,结构如下:shared/ ├── templates/ │ └── shared/ │ └── base.html ├── admin.py ├── apps.py └── ...(其他应用文件)确保Shared应用已加入INSTALLED_APPS
在项目的settings.py中,确认shared已经添加到INSTALLED_APPS列表:INSTALLED_APPS = [ # 系统默认应用(如django.contrib.admin等) 'shared', 'user', 'accounting', ]修改子应用的模板继承代码
在User或Accounting应用的base.html中,保持原有的继承代码即可:{% extends "shared/base.html" %} {% block content %} <div>Hello world</div> {% endblock content %}此时Django会遍历所有
INSTALLED_APPS中的应用,在Shared应用的templates/shared/目录下找到base.html,完成继承。
解决方案二:使用全局模板目录
如果不想给每个应用的模板加子目录,也可以创建一个全局模板目录:
在项目根目录创建全局模板目录
新建templates目录,把base.html直接放在这里:your_project/ ├── templates/ │ └── base.html ├── user/ ├── accounting/ ├── shared/ └── your_project/(项目配置目录)修改settings.py中的模板配置
在TEMPLATES配置里,把全局模板目录加入DIRS:TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [BASE_DIR / 'templates'], # 添加这一行 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]修改子应用的继承代码
子应用的base.html直接继承全局的base.html即可:{% extends "base.html" %} {% block content %} <div>Hello world</div> {% endblock content %}
内容的提问来源于stack exchange,提问作者CutePoison

