在线教程https://docs.djangoproject.com/en/dev/intro/tutorial02/#customizing-your-project-s-templates中,它指出将用户模板放入如下目录:
/project/app/templates/app/example.html
但是当自动模板加载器搜索时,它会查找:
/project/app/templates/
同样,当您尝试加载位于以下位置的默认模板时:
/Python27/Lib/site-packages/django/contrib/admin/templates/admin/base.html
它将搜索:
/Python27/Lib/site-packages/django/contrib/admin/templates/
我在这里遗漏了什么吗?我没有定义任何TEMPLATE_DIRS,因为我希望默认系统像教程所说的那样运行。
我感到困惑的原因是你在
中放置了应用程序原生的模板/project/app/templates
然后将非原生模板放入
/project/app/templates/non-native_app-name
使用{% extends "template.html" %}
时,您必须在模板之前放置应用名称,例如{% extends "app-name/template.html" %}
如果我在这里错了,请纠正我......感谢您的帮助
答案 0 :(得分:0)
如果您的django.template.loaders.app_directories.Loader
设置中有TEMPLATE_LOADERS
,则默认情况下这应该在您的设置中:
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
然后,django将搜索您的每个应用中的templates
目录,引用docs:
从文件系统上的Django应用程序加载模板。对于每个应用程序 INSTALLED_APPS,加载器查找模板子目录。如果 目录存在,Django在那里寻找模板。
这意味着您可以使用各个应用程序存储模板。这个 还可以使用默认模板轻松分发Django应用程序。
答案 1 :(得分:0)
如果您阅读django的源代码,可以在django.template.loaders.py中找到代码。
def find_template(name, dirs=None):
# Calculate template_source_loaders the first time the function is executed
# because putting this logic in the module-level namespace may cause
# circular import errors. See Django ticket #1292.
global template_source_loaders
if template_source_loaders is None:
loaders = []
for loader_name in settings.TEMPLATE_LOADERS:
loader = find_template_loader(loader_name)
if loader is not None:
loaders.append(loader)
template_source_loaders = tuple(loaders)
for loader in template_source_loaders:
try:
source, display_name = loader(name, dirs)
return (source, make_origin(display_name, loader, name, dirs))
except TemplateDoesNotExist:
pass
raise TemplateDoesNotExist(name)