了解Django模板自动搜索/文件系统

时间:2013-09-10 10:12:53

标签: templates django

在线教程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,因为我希望默认系统像教程所说的那样运行。

UPDATE /溶液

我感到困惑的原因是你在

中放置了应用程序原生的模板
/project/app/templates

然后将非原生模板放入

/project/app/templates/non-native_app-name

使用{% extends "template.html" %}时,您必须在模板之前放置应用名称,例如{% extends "app-name/template.html" %}

如果我在这里错了,请纠正我......感谢您的帮助

2 个答案:

答案 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)