【问题标题】:"TemplateDoesNotExist at /my_app_name" but Template-loader postmortem says "(File exists)"“TemplateDoesNotExist at /my_app_name”但模板加载器事后显示“(文件存在)”
【发布时间】:2015-11-21 09:41:23
【问题描述】:

我收到以下错误:

TemplateDoesNotExist at /app1/1/about/

index/index.html

但是模板加载器事后说:

/var/www/web/sites/mysite.com/app1/templates/index/index.html(文件存在)

我已经尝试了 stackoverflow 的所有类似问题的答案,但它们对我不起作用。在我的本地服务器上(在 OSX、virtualenv 上运行)一切正常,但在生产服务器上我收到此错误。在生产服务器上,我在带有 virtualenv 的 Ubuntu 14 上使用 Django 1.7.5。 每个应用都有自己的模板,结构如下:

app1
--templates
----index
------index.html
------head.html views.py app2
--templates
----index
------index.html
------head.html views.py

在 settings.py 我有以下模板参数:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
TEMPLATE_DEBUG = True
TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates'),]
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)
INSTALLED_APPS = (
    # django
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
     # widgets
     'widget_tweaks',
     'compressor',
     'tinymce',
     'django_activeurl',
     'debug_toolbar',
     # modules
     'app1',
     'app2',
 )

并将它们包含在这样的视图中:

template_event = loader.get_template('index/materials.html', dirs=["app1/templates/"])

【问题讨论】:

  • TemplateDoesNotExist 位于 /app1/1/about/index/index.html。第一个'index'之前有一个空格
  • 除非您没有将其包含在示例中,否则您没有名为 index/ 的目录。
  • 但是..在本地服务器上一切正常,我很困惑。
  • 我以为问题出在路径上,但是为什么它说该文件存在...
  • load_templates 中指定dirs 是不寻常的。如果您的设置正确,则不需要。使用相对目录'app1/templates/' 可能会导致问题。

标签: python django templates loader


【解决方案1】:

您通过传入 dirs 参数混淆了模板加载器,该参数覆盖了 TEMPLATE_DIRS 中的任何内容。

首先,如果您的所有模板都包含在应用目录中,则无需设置TEMPLATE_DIRS。如果您想从其他文件系统位置加载模板,则存在TEMPLATE_DIRS 变量。如果你所有的模板都在app/templates/,那么你就不需要设置TEMPLATE_DIRS

由于您尝试加载属于应用程序一部分的模板,只需将相对路径传递给模板即可:

template_event = loader.get_template('index/materials.html')

现在,这是 django 要做的事情(高度简化):

  1. 首先,它会查看 TEMPLATE_LOADERS,然后调用每个加载器的模板。第一个加载器是文件系统加载器,它将使用TEMPLATE_DIRS 设置来查找任何模板。如果此处的模板与路径匹配,则它将停止。

  2. 下一个加载器是app_directories 加载器,此加载器将在添加到INSTALLED_APPS 的任何应用程序中查找名为templates 的目录,然后返回第一个匹配的模板。

postmartem 告诉您加载程序已找到您的模板,但您要求他们加载模板的方式 - 他们找不到模板。

【讨论】:

  • 它已经部分工作了,但现在我在模板中遇到错误,包括来自另一个应用程序的文件...“{% include "misc/menu.html" %}",同样的模板doesntexists 错误跨度>
  • 那完全是另一回事。
  • django 的奇怪逻辑,我想。在我看来,它应该是这样的:尝试从 TEMPLATE_DIRS 中查找模板,如果没有模板,则从 INSTALLED_APPS 目录中加载它,但无论如何感谢您的回答。将其标记为答案。
  • 这正是它的工作原理——但是你传入了dirs 参数,这让整个系统崩溃了。
【解决方案2】:

刚刚意识到我的错误,在深入阅读了 django 文档后,发现 Alsadair 在 cmets 中的答案是正确的。

通常,建议放置一个 app1 子目录,即 app1/templates/app1/,并加载 app1/index/materials.html。然后 dirs 是 不必要的,在 load_templates 中,模板应该从 正确的目录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-16
    • 2015-07-15
    • 2019-12-04
    • 2017-04-20
    • 2016-08-27
    • 2012-07-03
    • 2020-06-20
    • 2018-09-29
    相关资源
    最近更新 更多