如何在Django中使用Jinja2继承其他App的模板?
解决Django Jinja2跨App模板继承的TemplateNotFound问题
问题场景
现有多Django项目,计划将通用功能提取至独立App中,当前项目结构如下:
myproject/ app1/ jinja2/ app1/ app1.html app2/ jinja2/ app2/ app2.html
尝试在app2.html中继承app1.html,使用语句:
{% extends "app1/app1.html" %}
触发错误:jinja2.exceptions.TemplateNotFound: app1/app1.html
当前settings.py中的Jinja2模板配置:
TEMPLATES = [ { 'BACKEND':'django.template.backends.jinja2.Jinja2', 'DIRS': [ PROJECT_DIR / 'jinjatemplates' ], 'APP_DIRS': True, }, { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], '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', ], }, }, ]
解决方案
方案1:添加App模板目录到Jinja2配置
修改settings.py中Jinja2的DIRS字段,将app1的jinja2目录加入搜索路径:
TEMPLATES = [ { 'BACKEND':'django.template.backends.jinja2.Jinja2', 'DIRS': [ PROJECT_DIR / 'jinjatemplates', PROJECT_DIR / 'app1' / 'jinja2', # 新增app1的jinja2目录 ], 'APP_DIRS': True, }, # ... 其余配置保持不变 ]
添加后Jinja2即可正确定位到app1/app1.html模板路径。
方案2:统一通用模板到项目级目录
将app1.html迁移至项目根目录的jinjatemplates/app1/下(即已配置的DIRS目录),目录结构变为:
myproject/ jinjatemplates/ app1/ app1.html app2/ jinja2/ app2/ app2.html
这种方式更便于集中管理通用模板,且无需修改额外配置。
方案3:确认App已注册到INSTALLED_APPS
确保app1已添加至settings.py的INSTALLED_APPS列表,否则即使APP_DIRS=True,Django也不会扫描该App的模板目录:
INSTALLED_APPS = [ # ... 其他已注册App 'app1', 'app2', ]
内容的提问来源于stack exchange,提问作者user22066066
相关产品推荐
相关产品推荐

