django 中有 2种 Template Loader
django.template.loaders.filesystem.Loader
django.template.loaders.app_directories.Loader
filesystem.Loader 会根据 settings 中 TEMPLATES 下配置的 DIRS 查找 template
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': False, 'OPTIONS': { }, }, ]
app_directories.Loader 顾名思义会到各个 app 下面的 templates 文件夹下去查找 template
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { }, }, ]
APP_DIRS 为 True 表示启用 app_directories.Loader loader
通常把模板放到最外层和放到各个 app 下面都是一样的,公共的模板可以放在最外层,各个 app 相关的可以放到 app 下面,因为 app 是独立的,可能会被用到多个项目中。
在各个 app 下面的 templates 文件夹下通常会多加一层文件夹,并以该 app 的名字来命名,这主要是为了防止模板重名, 因为当启用 app_directories.Loader 时
django 会从 INSTALLED_APPS 中从上到下依次查找各个app下的模板文件, static 文件也是一样的。
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog', )