10

The template file is saved under the app directory, but it raises TemplateDoesNotExist exception while rendering:

Template-loader postmortem as following:

Django tried loading these templates, in this order:

Using loader django.template.loaders.app_directories.Loader:
    ...
    $PROJECT/apps/myapp/templates/search.html (File does not exist)
    ...

I'm wondering why it looks for:

$PROJECT/apps/myapp/templates/search.html

rather than:

$PROJECT/apps/myapp/templates/myapp/search.html

The latter does exist indeed

4

4 回答 4

8

$PROJECT/apps/myapp/templates/search.html. 这就是文档所说的它将寻找的路径。

django.template.loaders.app_directories.Loader将按顺序templates在所有目录中查找目录。INSTALLED_APPS

于 2013-06-17T06:49:00.497 回答
4

django.template.loaders.filesystem.load_template_source:此加载器根据 TEMPLATE_DIRS 从文件系统加载模板。默认情况下启用。

django.template.loaders.app_directories.load_template_source:此加载器从文件系统上的 Django 应用程序加载模板。对于 INSTALLED_APPS 中的每个应用程序,加载程序都会查找模板子目录。如果目录存在,Django 会在那里寻找模板。

这意味着您可以将模板与您的单个应用程序一起存储,从而可以轻松地使用默认模板分发 Django 应用程序。例如,如果 INSTALLED_APPS 包含 ('myproject.polls', 'myproject.music'),则 get_template('foo.html') 将按以下顺序查找模板:

/path/to/myproject/polls/templates/foo.html
/path/to/myproject/music/templates/foo.html

请注意,加载器在第一次导入时会执行优化:它缓存一个列表,其中 INSTALLED_APPS 包具有模板子目录。

默认情况下启用此加载程序。

于 2015-02-11T07:58:54.623 回答
0

假设您有一个默认项目和应用程序创建为

  1. django-admin 启动项目 xyz
  2. django-admin startapp abc
  3. xyz 和 abc 文件夹都在主项目文件夹中

需要进行最少的更改才能使第一个模板正常工作

  1. 在 settings.py 中更改 INSTALLED_APPS 以添加“abc”(我忘记了,失败了)
  2. 在 urls.py 添加
  • 添加行:import abc.views
  • 更改 urlpatterns 以添加 path('abc/', abc.views.index)
  1. 在 views.py 的索引定义中使用 loader.get_template('abc/index.html')
  2. 创建 abc/templates/abc/index.html 文件(我写了“模板”并花了几个小时才意识到那是“模板”)
  3. 确保模板和内部文件夹具有执行权限,并且 html 文件具有“其他”用户的读取权限。(我以 root 身份工作,但由于此错误而失败)
  4. 重启项目(runserver 或 apache2 服务)

我的错误总结

  1. 编辑 INSTALLED_APPS
  2. “模板”是默认的
  3. 设置 x 和 r 权限
于 2020-07-20T12:21:35.610 回答
-3

将它们添加到您的设置文件中。

    import os
    PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))

    TEMPLATE_DIRS = (
        os.path.join(PROJECT_ROOT, "/apps/myapp/templates/"),
    )
于 2013-06-17T06:41:45.460 回答