0

从在线教程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" %}

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

4

2 回答 2

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)
于 2013-09-10T12:17:11.653 回答
0

如果您django.template.loaders.app_directories.LoaderTEMPLATE_LOADERS设置中有,默认情况下这实际上应该在您的设置中:

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)

然后,django 将搜索templates您的每个应用程序中的目录,引用自docs

从文件系统上的 Django 应用程序加载模板。对于 INSTALLED_APPS 中的每个应用程序,加载程序都会查找模板子目录。如果该目录存在,Django 会在其中查找模板。

这意味着您可以将模板与您的个人应用程序一起存储。这也使得使用默认模板分发 Django 应用程序变得容易。

于 2013-09-10T10:25:52.923 回答