Django配置templates目录实现registration内base.html继承根目录模板
问题说明
当前templates文件夹绝对路径:/Users/AndyKw/Documents/Python/Else/Yes/templates
目录结构:
templates (存放need.html) | |-- admin | |-- registration (存放base.html)
核心要求:
- 配置
settings.py的TEMPLATES参数时,将registration目录设为模板主目录 - registration内的
base.html可通过{% extends %}标签正常加载templates根目录下的need.html - 不允许调换两个文件的存放位置(该方案为最低优先级,开发团队不认可)
可行解决方案
方案1:按优先级配置TEMPLATES的DIRS路径(最推荐,符合所有要求)
Django模板加载器会严格按照DIRS列表的路径顺序从上到下查找模板,只要将两个路径按优先级顺序写入配置即可:registration路径放前面满足「主目录」的优先级要求,再追加templates根目录路径作为兜底查找路径。
配置步骤:
- 打开项目下的
settings.py,找到TEMPLATES配置段 - 修改
DIRS配置,推荐用BASE_DIR拼接相对路径,不要写死绝对路径,避免项目迁移后失效:
from pathlib import Path # 保留原有BASE_DIR配置即可,一般默认指向manage.py所在的项目根目录 BASE_DIR = Path(__file__).resolve().parent.parent TEMPLATES = [ { "BACKEND": "django.template.backends.django.DjangoTemplates", # 路径顺序决定查找优先级,前面的路径优先匹配 "DIRS": [ BASE_DIR / "templates" / "registration", # 高优先级:registration主目录 BASE_DIR / "templates", # 兜底: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中写{% extends "need.html" %}即可正常加载,不需要加任何路径前缀。加载逻辑为:先在registration目录查找need.html,找不到自动跳转至下一个配置的templates根目录查找,完全匹配需求。
方案2:模板内直接写相对上层路径(零配置改动)
如果不想调整settings.py配置,直接利用Django模板支持的相对路径规则即可,不需要修改任何全局配置。
在registration/base.html中,extends标签按如下写法:
{% extends "../need.html" %}
其中../代表当前模板所在目录的上一级,也就是templates根目录,可直接定位到need.html文件。
注意:该方法兼容Django 1.8及以上所有版本,低于1.8的老旧版本可能存在相对路径解析问题,优先选择方案1更稳妥。
不推荐方案
调换两个文件的存放路径:将need.html移入registration文件夹、base.html移至templates根目录。该方案不符合团队目录规范,仅作为最后兜底选项。
内容的提问来源于stack exchange,提问作者Andy K
相关产品推荐
相关产品推荐

