Django多应用开发中点击第三个应用跳转至第二个应用页面的模板配置问题
Django多应用模板路径不生效问题解决
Django 模板的 DIRS 配置本身没有最多2个路径的上限,你遇到的问题本质是模板查找优先级和命名冲突导致的:
Django 查找模板时会严格按照 DIRS 列表的路径顺序遍历,找到第一个文件名匹配的模板就会直接返回,不会继续查找后续路径。如果三个应用的模板用了相同的文件名(比如都命名为index.html),排在前面的路径下的同名模板会直接覆盖后面路径的模板,就会出现点击第三个应用跳转到第二个应用页面的现象。
修复步骤
- 规范模板目录结构
每个应用的templates目录下新增一层和应用同名的子目录,目录结构参考:项目根目录 ├─ Home │ └─ templates │ └─ Home │ └─ index.html ├─ cloud_storage │ └─ templates │ └─ cloud_storage │ └─ index.html └─ mail └─ templates └─ mail └─ index.html - 调整视图模板引用路径
各应用的视图渲染模板时,带上应用前缀区分,例如mail应用的视图写法:def index(request): # 业务逻辑 return render(request, 'mail/index.html') - 简化模板配置
你已经开启了APP_DIRS: True配置,只要三个应用都已经添加到settings.py的INSTALLED_APPS列表中,Django会自动识别每个应用下templates目录的模板,不需要手动把每个应用的模板路径添加到DIRS里。DIRS通常只用来存放项目全局的公共模板。
额外注意事项
你当前的配置混用了路径拼接方式,BASE_DIR/'Home/templates'用的是Path对象运算符,mail、cloud变量用的是os.path.join,建议统一写法,Django 3.1及以上版本默认BASE_DIR为Path对象,可统一调整为:
#--assigning apps templates as values-- TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', #--rooting the values as dirs -- 'DIRS': [ BASE_DIR / 'Home' / 'templates', BASE_DIR / 'cloud_storage' / 'templates', BASE_DIR / 'mail' / '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', ], }, }, ]
内容的提问来源于stack exchange,提问作者Manimaran Kuppuswamy
相关产品推荐
相关产品推荐

