【问题标题】:django.template.loaders.app_directories.Loader fails to find the template filedjango.template.loaders.app_directories.Loader 找不到模板文件
【发布时间】:2013-06-13 01:14:54
【问题描述】:

模板文件保存在app目录下,但渲染时引发了TemplateDoesNotExist异常:

模板加载器事后分析如下:

Django 尝试按以下顺序加载这些模板:

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

我想知道为什么它会寻找:

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

而不是:

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

后者确实存在

【问题讨论】:

  • 您好,能否请您添加用于请求模板的代码?你有类似t = loader.get_template('myapp/search.html') 的东西吗?

标签: django django-templates


【解决方案1】:

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

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

    TEMPLATE_DIRS = (
        os.path.join(PROJECT_ROOT, "/apps/myapp/templates/"),
    )

【讨论】:

  • 使用django模板加载器时,不需要指定TEMPLATE_DIRS
【解决方案2】:

$PROJECT/apps/myapp/templates/search.html。这就是它将寻找的路径为doc says

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

【讨论】:

  • 我忘记了它应该是 get_template("myapp/search.html") 而不是 get_template("search.html")。我只记得使用“myapp/templates/myapp/search.html”路径创建模板文件是最佳实践,但这并不意味着在查找模板时不需要路径中的“myapp”。是我的错。谢谢大家。
  • 对我来说同样的问题,所以我们应该总是使用 [appname]/[template].html 结构吗?
【解决方案3】:

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 包具有模板子目录。

默认启用此加载程序。

【讨论】:

    【解决方案4】:

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

    1. django-admin startproject 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 权限

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-06
      • 2014-12-04
      • 1970-01-01
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      相关资源
      最近更新 更多