2009-12-18 163 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