我收到以下错误:
/ 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/"])
答案 0 :(得分:0)
您通过传递dirs
参数来混淆模板加载器,该参数会覆盖TEMPLATE_DIRS
中的任何内容。
首先,如果所有模板都包含在应用程序目录中,则无需设置TEMPLATE_DIRS
。如果要从其他文件系统位置加载模板,则存在TEMPLATE_DIRS
变量。如果您的所有模板都在app/templates/
,那么您无需设置TEMPLATE_DIRS
。
由于您尝试加载属于应用程序的模板,只需将相对路径传递给模板:
template_event = loader.get_template('index/materials.html')
现在,这就是django要做的事情(高度简化):
首先,它将查看TEMPLATE_LOADERS,然后为每个加载器调用其模板。第一个加载器是文件系统加载器,它将使用TEMPLATE_DIRS
设置来查找任何模板。如果此处的模板与路径匹配,则它将停止。
下一个加载器是app_directories
加载器,此加载器将在添加到templates
的任何应用程序中查找名为INSTALLED_APPS
的目录,然后返回第一个模板匹配。
postmartem告诉你加载器找到了你的模板,但是你要求他们加载模板的方式 - 他们找不到模板。
答案 1 :(得分:0)
在深入阅读django文档之后,我意识到自己的错误,在评论中发现Alsadair是对的。
通常,建议放一个app1子目录,即 app1 / templates / app1 /,并加载app1 / index / materials.html。然后是dirs 在load_templates中不必要,并且应该从中加载模板 正确的目录。