2009-12-18 19 views
77

Máy cục bộ của tôi đang chạy Python 2.5 và Nginx trên Ubuntu 8.10, với Django được xây dựng từ thân cây phát triển mới nhất.Django TemplateDoesNotExist?

Đối với mỗi URL tôi yêu cầu, nó ném:

 
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',) 

Có tìm kiếm /usr/lib/python2.5/site-packages/projectname/templates/appname/template_name.html trong trường hợp này? Điều kỳ lạ là tập tin này tồn tại trên đĩa. Tại sao Django không thể định vị nó?

Tôi chạy cùng một ứng dụng trên máy chủ từ xa với Python 2.6 trên Ubuntu 9.04 mà không có sự cố như vậy. Các cài đặt khác giống nhau.

Có bất kỳ điều gì được định cấu hình sai trên máy cục bộ của tôi hay những lỗi có thể gây ra lỗi mà tôi nên xem xét?

Trong settings.py của tôi, tôi đã xác định:

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'), 
) 

Nó shoule thể tìm kiếm các tập tin sau đây

 
/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 
... 

Tất cả các tập tin trên tồn tại trên đĩa.

SOLVED

Nó hoạt động bây giờ sau khi tôi đã cố gắng chown -R www-data:www-data /usr/lib/python2.5/site-packages/projectname/*

Đó là lạ. Tôi không cần phải làm điều này trên máy chủ từ xa để làm cho nó hoạt động.

+0

TEMPLATE_DIRS của bạn có thể đọc được bởi máy chủ web không? –

+0

@Jordan, TEMPLATE_DIRS có thể truy cập bằng thư mục gốc là đủ. Đó là những gì nó được cấu hình trên máy chủ từ xa đang hoạt động. – jack

Trả lời

112

giải pháp đầu tiên:

Các thiết lập này

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

nghĩa là Django sẽ xem xét các mẫu từ templates/ thư mục thuộc dự án của bạn.

Giả sử dự án Django của bạn nằm ở /usr/lib/python2.5/site-packages/projectname/ sau đó với các thiết lập của bạn django sẽ tìm kiếm các mẫu dưới /usr/lib/python2.5/site-packages/projectname/templates/

Vì vậy, trong trường hợp đó chúng tôi muốn chuyển mẫu của chúng tôi để được cấu trúc như thế này:

/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 

Giải pháp thứ hai:

Nếu điều đó vẫn không hoạt động và giả định rằng bạn có ứng dụng được định cấu hình trong settings.py như thế này:

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

Theo mặc định, Django sẽ tải các mẫu trong thư mục templates/ trong mọi ứng dụng đã cài đặt.Vì vậy, với cấu trúc thư mục của bạn, chúng tôi muốn di chuyển các mẫu của chúng tôi như sau:

/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 

Hy vọng điều đó sẽ hữu ích.

SETTINGS_PATH có thể không được xác định theo mặc định. Trong trường hợp đó, bạn sẽ muốn xác định nó (trong settings.py):

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

@jpartogi, tôi đã thử cả hai cách tiếp cận nhưng không hoạt động. Tôi thậm chí đã cố gắng sử dụng đường dẫn tuyệt đối cho mẫu trong đối số render_to_response() nhưng vẫn không hoạt động. – jack

+0

Dự án django của bạn có nằm trong '/ usr/lib/python2.5/site-packages/projectname /' không? –

+0

@jpartogi, vâng, tất cả các ứng dụng đã cài đặt đều nằm trong /usr/lib/python2.5/site-packages/projectname/appname1, ... – jack

3

Chỉ cần linh cảm, nhưng hãy kiểm tra this article on Django template loading. Cụ thể, hãy đảm bảo bạn có django.template.loaders.app_directories.Loader trong danh sách TEMPLATE_LOADERS của bạn.

+0

Điều này làm việc cho tôi. Tải mẫu từ ứng dụng Django trên hệ thống tệp. Đối với mỗi ứng dụng trong INSTALLED_APPS, trình tải sẽ tìm kiếm thư mục con mẫu. Nếu thư mục tồn tại, Django sẽ tìm các mẫu trong đó.
TEMPLATES = [{ 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': Đúng, }] – Vijay

0

Kiểm tra xem templates.html của bạn có nằm trong mục /usr/lib/python2.5/site-packages/projectname/templates dir hay không.

4

Kiểm tra quyền truy cập vào các mẫu và appname thư mục, hoặc với ls -l hoặc thử làm một đường dẫn tuyệt đối open() từ django.

4

tại Nó hoạt động sau khi tôi đã cố gắng

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

Đó là lạ. Tôi không cần phải làm điều này trên máy chủ từ xa để làm cho nó hoạt động.

Ngoài ra, tôi phải chạy lệnh sau trên máy cục bộ để làm cho tất cả các tệp tĩnh có thể truy cập được nhưng trên máy chủ từ xa, tất cả chúng đều là "root: root".

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

Máy địa phương chạy trên Ubuntu 8.04 ấn bản dành cho máy tính để bàn. Máy chủ từ xa nằm trên phiên bản máy chủ Ubuntu 9.04.

Bất kỳ ai cũng biết tại sao?

3

Django TemplateDoesNotExist lỗi có nghĩa đơn giản là khuôn khổ không thể tìm thấy tệp mẫu.

Để sử dụng API tải mẫu, bạn cần phải nói cho khuôn khổ nơi bạn lưu trữ mẫu của mình. Nơi để làm điều này là trong tập tin cài đặt của bạn (settings.py) bởi thiết lập TEMPLATE_DIRS. Theo mặc định, nó là một bộ trống, vì vậy thiết lập này cho cơ chế tải mẫu của Django tìm kiếm các khuôn mẫu ở đâu.

Chọn một thư mục mà bạn muốn để lưu trữ các mẫu của bạn và thêm nó vào TEMPLATE_DIRS ví dụ:

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

OMG tôi không thể tin rằng điều này làm việc, man u ar awsome –

27

Tìm tuple này:

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', 
      ], 
     }, 
    }, 
] 

Bạn cần phải thêm vào 'dirs' các chuỗi

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

Vì vậy, hoàn toàn bạn cần:

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' là không thực sự được xác định bất cứ nơi nào, vì vậy tôi không nghĩ rằng câu trả lời này sẽ làm việc.Có lẽ bạn có nghĩa là" BASE_DIR' – sofly

6

Trong thiết py loại bỏ TEMPLATE_LOADERS và TEMPLATE dirs Sau đó 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

Cảm ơn! Thêm đường dẫn đến 'DIRS' làm việc hoàn hảo . – Shilpa

1

Đối với phiên bản 1.9 django, tôi đã thêm

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

dòng vào Templates chặn trong cài đặt.py Và nó làm việc tốt

0

Xem mà django thư mục cố gắng để tải mẫu nhìn vào Template-loader postmortem trong trang lỗi, ví dụ, lỗi sẽ sothing như thế này:

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) 

Trong lỗi của tôi vcsrc\vcsrc\templates\base.html không trên đường đi.
Sau đó thay đổi TEMPLATES trong setting.py tập tin vào con đường mẫu của bạn

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

Hi guys Tôi tìm thấy một giải pháp mới. Trên thực tế, nó được xác định trong một mẫu khác thay vì tự định nghĩa TEMPLATE_DIRS, hãy đặt tên đường dẫn thư mục của bạn tại: enter image description here

Các vấn đề liên quan