Docker环境下Django多配置文件配置后出现TEMPLATE_DOES_NOT_EXIST错误
我之前在搭建Django多环境配置时也踩过这个坑,你的问题根源大概率是**testing.py没有继承base.py中的完整配置**,导致模板相关的关键设置缺失了。下面是具体的排查和解决步骤:
1. 让testing.py继承base.py的通用配置
你的base.py应该包含所有环境通用的配置(包括模板、静态文件、INSTALLED_APPS等),而testing.py只需要覆盖测试环境特有的配置(比如DEBUG、数据库、测试相关设置)。所以第一步要在testing.py开头加上继承语句:
# mysite/settings/testing.py from .base import * # 下面只写测试环境需要修改的配置,比如: DEBUG = True DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db_test.sqlite3', } }
如果你的testing.py之前只写了部分配置,没有继承base.py,那Django就会缺失模板路径、模板引擎这些核心设置,自然会报找不到模板的错误。
2. 确认base.py中的模板配置完整
检查base.py里的TEMPLATES配置是否包含必要的项,比如模板目录、是否启用APP内模板:
# mysite/settings/base.py import os from pathlib import Path BASE_DIR = Path(__file__).resolve().parent.parent.parent # 注意路径层级:settings包在mysite下,所以要往上跳3级到项目根目录 TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], # 项目根目录下的templates文件夹 'APP_DIRS': True, # 允许加载各APP内的templates目录 '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_DIR的路径是否正确,因为Docker容器内的项目路径和本地可能一致,但如果路径层级错了,DIRS指向的模板目录就不存在了。
3. 验证Docker环境下的配置生效
可以进入Docker容器的shell,直接查看当前配置的模板路径,确认是否正确:
# 替换<your-service-name>为docker-compose.yml里的服务名 docker-compose exec <your-service-name> python manage.py shell --settings=mysite.settings.testing
在Python shell中执行:
from django.conf import settings print(settings.TEMPLATES[0]['DIRS']) print(settings.BASE_DIR)
查看输出的路径是否和容器内实际的模板目录一致,如果不一致,调整BASE_DIR或者TEMPLATES里的DIRS配置。
4. 确认配置路径的正确性
检查你的项目结构是否和配置路径匹配,正确的结构应该是这样的:
your-project-root/ ├── mysite/ │ ├── settings/ │ │ ├── __init__.py │ │ ├── base.py │ │ └── testing.py │ ├── manage.py │ └── ... # 其他APP和文件 └── docker-compose.yml
这种情况下,--settings=mysite.settings.testing的路径是正确的,因为settings是mysite包下的子包。
按照上面的步骤调整后,模板找不到的问题应该就能解决了。
内容的提问来源于stack exchange,提问作者Ryan Skene

