" TemplateDoesNotExist at / my_app_name"但模板加载器postmortem说"(文件存在)"

时间:2015-08-27 06:22:53

标签: python django templates loader

我收到以下错误:

  

/ app1 / 1 / about /

上的TemplateDoesNotExist      

索引/ index.html中

但是模板加载器postmortem说:

  

/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/"])

2 个答案:

答案 0 :(得分:0)

您通过传递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加载器,此加载器将在添加到templates的任何应用程序中查找名为INSTALLED_APPS的目录,然后返回第一个模板匹配。

  3. postmartem告诉你加载器找到了你的模板,但是你要求他们加载模板的方式 - 他们找不到模板。

答案 1 :(得分:0)

在深入阅读django文档之后,我意识到自己的错误,在评论中发现Alsadair是对的。

  

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