django.template.loaders.app_directories.Loader无法找到模板文件

时间:2013-06-17 06:24:40

标签: django django-templates

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

模板加载器postmortem如下:

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

后者确实存在

4 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

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

django.template.loaders.app_directories.load_template_source :此加载程序从文件系统上的Django应用程序加载模板。对于INSTALLED_APPS中的每个应用程序,加载程序都会查找templates子目录。如果目录存在,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包中有一个模板子目录的列表。

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

答案 2 :(得分:0)

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

  1. django-admin startproject xyz
  2. django-admin startapp abc
  3. xyz和abc文件夹都位于主项目文件夹中

只需进行最少的更改即可使第一个模板正常工作

  1. 在settings.py中更改INSTALLED_APPS以添加“ abc”(我忘记了并失败了)
  2. 在urls.py中添加
  • 添加行:导入abc.views
  • 更改urlpatterns以添加路径('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权限

答案 3 :(得分:-3)

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

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

    TEMPLATE_DIRS = (
        os.path.join(PROJECT_ROOT, "/apps/myapp/templates/"),
    )
相关问题