2009-12-18 165 views
77

我的本地机器在Ubuntu 8.10上运行Python 2.5和Nginx,Django由最新开发主干构建。Django TemplateDoesNotExist?

对于每一个我请求URL,它抛出:

 
TemplateDoesNotExist at /appname/path 
appname/template_name.html 

Django tried loading these templates, in this order: 
* Using loader django.template.loaders.filesystem.function: 
* Using loader django.template.loaders.app_directories.function: 

TEMPLATE_DIRS ('/usr/lib/python2.5/site-packages/projectname/templates',) 

它是在这种情况下,寻找/usr/lib/python2.5/site-packages/projectname/templates/appname/template_name.html?奇怪的是这个文件存在于磁盘上。为什么Django无法找到它?

我使用Ubuntu 9.04上的Python 2.6在远程服务器上运行相同的应用程序,但没有出现此类问题。其他设置相同。

在我的本地计算机上是否有任何配置错误,或者可能导致我应该查看的这些错误?

在我的settings.py,我指定:

SETTINGS_PATH = os.path.normpath(os.path.dirname(__file__)) 
# Find templates in the same folder as settings.py. 
TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'), 
) 

它shoule寻找下列文件

 
/usr/lib/python2.5/site-packages/projectname/templates/appname1/template1.html 
/usr/lib/python2.5/site-packages/projectname/templates/appname1/template2.html 
/usr/lib/python2.5/site-packages/projectname/templates/appname2/template3.html 
... 

上述所有文件是否存在磁盘上。

解决

它的工作原理后,现在我想chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*

很奇怪。我不需要在远程服务器上执行此操作来使其工作。

+0

是否您的TEMPLATE_DIRS可由Web服务器读取? – 2009-12-18 03:23:55

+0

@Jordan,TEMPLATE_DIRS可由root访问就足够了。这是它在正在工作的远程服务器上配置的。 – jack 2009-12-18 03:46:17

回答

112

首先解决

这些设置

TEMPLATE_DIRS = (
    os.path.join(SETTINGS_PATH, 'templates'), 
) 

意味着Django会看模板从templates/目录项目下。

假设你的Django项目位于/usr/lib/python2.5/site-packages/projectname/然后用你的设置Django会寻找模板所以,我们希望将我们的模板进行结构像这样的情况下/usr/lib/python2.5/site-packages/projectname/templates/

/usr/lib/python2.5/site-packages/projectname/templates/template1.html 
/usr/lib/python2.5/site-packages/projectname/templates/template2.html 
/usr/lib/python2.5/site-packages/projectname/templates/template3.html 

解决方法二

如果仍然不工作,假设你有settings.py中配置这样的应用:

INSTALLED_APPS = (
    'appname1', 
    'appname2', 
    'appname3', 
) 

默认情况下,Django将在每个安装的应用程序下的templates/目录下加载模板。因此,对于您的目录结构,我们希望将我们的模板移动为这样:

/usr/lib/python2.5/site-packages/projectname/appname1/templates/template1.html 
/usr/lib/python2.5/site-packages/projectname/appname2/templates/template2.html 
/usr/lib/python2.5/site-packages/projectname/appname3/templates/template3.html 

希望有所帮助。

SETTINGS_PATH可能不会被默认定义。在这种情况下,你会希望把它定义(在settings.py):在模板和应用程序的名字目录

import os 
SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)) 
+1

@jpartogi,我尝试了两种方法,但都不起作用。我甚至试图在render_to_response()参数中使用模板的绝对路径,但仍然无法工作。 – jack 2009-12-18 04:56:14

+0

你的django项目是否在'/ usr/lib/python2.5/site-packages/projectname /'下? – 2009-12-18 05:02:58

+0

@jpartogi,是的,所有安装的应用程序位于/usr/lib/python2.5/site-packages/projectname/appname1,... – jack 2009-12-18 05:07:05

3

只是一个预感,但检查出this article on Django template loading。尤其要确保您的TEMPLATE_LOADERS列表中有django.template.loaders.app_directories.Loader

+0

这对我有用。从文件系统中的Django应用程序加载模板。对于INSTALLED_APPS中的每个应用程序,加载器查找模板子目录。如果该目录存在,Django将在其中查找模板。
TEMPLATES = [{'BACKEND':'django.template.backends.django.DjangoTemplates', 'APP_DIRS':True, }]] – Vijay 2015-06-06 13:50:30

0

检查您的templates.html是否在/usr/lib/python2.5/site-packages/projectname/templates dir中。

4

检查权限,无论是与ls -l命令或尝试做从Django中绝对路径的open()。

4

它现在我试图

chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/* 

真是奇怪了。我不需要在远程服务器上做到这一点,使其工作。

另外,我要运行本地机器上运行以下命令,使所有静态文件accessable但远程服务器上他们都是“根:根”。

chown -R www-data:www-data /var/www/projectname/* 

本地机器在Ubuntu 8.04桌面版上运行。远程服务器在Ubuntu 9.04服务器版上。

任何人都知道这是为什么?

3

Django的TemplateDoesNotExist错误只是意味着该框架找不到模板文件。

要使用模板加载API,你需要告诉您存储您的模板的框架。要做到这一点的地方是在您的设置文件(settings.py)通过TEMPLATE_DIRS设置。默认情况下,它是一个空的元组,所以这个设置告诉Django的模板加载机制在哪里查找模板。

选择一个目录,你想保存你的模板,并将其添加到TEMPLATE_DIRS例如:

TEMPLATE_DIRS = (
    '/home/django/myproject/templates', 
) 
+1

OMG我无法相信这个工作,你很蠢。 – 2016-04-02 17:10:46

27

找到这个元组:

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
    }, 
] 

您需要添加到“DIRS”的串

"os.path.join(SETTINGS_PATH, 'templates')" 

这么干脆,你需要:

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [os.path.join(SETTINGS_PATH, 'templates')], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.template.context_processors.request', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
      ], 
     }, 
    }, 
] 
+13

'SETTINGS_PATH'实际上并没有在任何地方定义过,所以我不认为这个答案会起作用。也许你的意思是'BASE_DIR' – sofly 2016-02-03 21:05:11

6

在设定的.py 除去 TEMPLATE_LOADERS和TEMPLATE DIRS然后ADD

TEMPLATES = [ 
{ 
    'BACKEND': 'django.template.backends.django.DjangoTemplates', 
    'DIRS': ['/home/jay/apijay/templates',], 
    'APP_DIRS': True, 
    'OPTIONS': { 
     'context_processors': [ 
      'django.template.context_processors.debug', 
      'django.template.context_processors.request', 
      'django.contrib.auth.context_processors.auth', 
      'django.contrib.messages.context_processors.messages', 
     ], 
    }, 
}, 
] 
+1

谢谢!添加路径到'DIRS'工作完美。 – Shilpa 2016-08-16 17:19:35

1

对于django的版本1.9,我添加

'DIRS': [os.path.join(BASE_DIR, 'templates')], 

线到模板阻止设置。PY ,效果不错

0

看到哪些文件夹的Django尝试Template-loader postmortem错误页面加载模板的外观,例如,错误将sothing这样的:

Template-loader postmortem 

Django tried loading these templates, in this order: 

Using engine django: 
django.template.loaders.filesystem.Loader: d:\projects\vcsrc\vcsrc\templates\base.html (Source does not exist) 

在我的错误vcsrc\vcsrc\templates\base.html没有路径。
然后改变TEMPLATESsetting.py文件到您的模板路

TEMPLATES = [ 
    {  
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     # 'DIRS': [], 
     'DIRS': [os.path.join(BASE_DIR, 'vcsrc/templates')], 
     ... 
-2

嗨,大家好我发现了一个新的解决方案。实际上,它是在另一个模板中定义的,因此您不必自己定义TEMPLATE_DIRS,而是将您的目录路径名称设置为: enter image description here