Mẫu DjangoDoesNotExist?


163

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 phát triển mới nhất.

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

TemplateDoesNotExist tại / appname / path appname / template_name.html

Django đã thử tải các mẫu này, theo thứ tự sau: * Sử dụng trình tải django.template.loaders.filesystem.feft: * Sử dụng trình tải django.template.loaders.app_directories.feft:

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

Có phải nó đang tìm kiếm /usr/lib/python2.5/site-packages/projectname/temsheet/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ột máy chủ từ xa với Python 2.6 trên Ubuntu 9.04 mà không gặp vấn đề như vậy. Các cài đặt khác đều giống nhau.

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

Trong phần cài đặt của tôi , tôi đã chỉ đị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ó sẽ được tìm kiếm các tập tin sau:

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

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

Đã giải quyết

Nó hoạt động ngay sau khi tôi thử:

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

Nó thật kì 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.


Máy chủ web của bạn có thể đọc được TEMPLATE_DIRS không?
Jordan Messina

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

Câu trả lời:


196

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

Những cài đặt này

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

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

Giả sử dự án Django của bạn được đặt tại /usr/lib/python2.5/site-packages/projectname/đó với cài đặt của bạn, django sẽ tìm các mẫu bên dưới/usr/lib/python2.5/site-packages/projectname/templates/

Vì vậy, trong trường hợp đó, chúng tôi muốn di chuyển các mẫu của mình đượ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ả sử rằng bạn có các ứng dụng được định cấu hình trong settings.txt như thế này:

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

Theo mặc định, Django sẽ tải các mẫu trong templates/thư mục dưới mỗi ứng dụng được 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 mình thành như thế này:

/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_PATHcó 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__))

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

Là dự án django của bạn dưới /usr/lib/python2.5/site-packages/projectname/?
Joshua Partogi

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

Bạn có thể vui lòng chỉnh sửa bài viết gốc của bạn và dán settings.txt. Không bao gồm Cấu hình DB: -d. Cảm ơn.
Joshua Partogi

Để đặt mọi mẫu từ các ứng dụng khác nhau trong một thư mục templateskhông phải là một thiết kế tốt. Nhưng, như tôi biết, sau khi thêm bạn APP_NAMEvào settings.py, djangocó thể tìm kiếm mẫu của ứng dụng trong thư mục nằm dưới APP_DIR. Vì vậy, bạn có thể tách mẫu cho các ứng dụng khác nhau. (Django 1.7 - .1.9
Alston

59

Tìm tuple này:

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

    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 thêm vào 'DIRS' 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',
            ],
        },
    },
]

24
SETTINGS_PATHkhông thực sự được định nghĩa ở bất cứ đâu, vì vậy tôi không nghĩ rằng câu trả lời này sẽ hoạt động. Có thể bạn có ýBASE_DIR
nhẹ nhàng

1
xác định SETTINGS_PATH = os.path.dirname (os.path.dirname ( tệp ))
Shapon Pal

1
Tôi nghĩ Shapon Pal có nghĩa là SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)), không phải tệp
mic

20

Nếu bạn gặp phải vấn đề này khi bạn thêm apptừ đầu. Có lẽ là vì bạn bỏ lỡ một số settings. Ba bước là cần thiết khi thêm một app.

1 Tạo thư mục và tệp mẫu.

Giả sử bạn có một dự án được đặt tên mysitevà bạn muốn thêm một apptên được đặt tên your_app_name. Đặt tệp mẫu của bạn dưới mysite/your_app_name/templates/your_app_nameđây như sau.

├── mysite
   ├── settings.py
   ├── urls.py
   └── wsgi.py
├── your_app_name
   ├── admin.py
   ├── apps.py
   ├── models.py
   ├── templates
      └── your_app_name
          └── my_index.html
   ├── urls.py
   └── views.py

2 、 Thêm của bạn appvào INSTALLED_APPS.

Sửa đổi settings.py

INSTALLED_APPS = [
    ...
    'your_app_name',
    ...
]

3 、 Thêm appthư mục của bạn DIRSvào TEMPLATES.

Sửa đổi settings.py.

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
                ...
                ]
    }
]

Đây là giải pháp duy nhất phù hợp với tôi khi sử dụng django 2.2.7
Jhonatas Kleinkauff

1
Trong trường hợp của tôi chỉ thiếu bước 2. mảng DIRS tôi có thể để trống và nó vẫn hoạt động và tìm mẫu trong thư mục mẫu bên phải của ứng dụng.
Shri Shinde

13

Trong cài đặt .py, xóa TEMPLATE_LOADERS và TEMPLATE DIRS Sau đó THÊM

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

5

Tôi đã có một vấn đề đáng xấu hổ ...

Tôi đã gặp lỗi này vì tôi đang vội vã và quên đặt ứng dụng vào INSTALLED_APPS. Bạn sẽ nghĩ Django sẽ đưa ra một lỗi mô tả nhiều hơn.


4

Chỉ là một linh cảm, nhưng hãy xem bài viết này về tải mẫu Django . Cụ thể, hãy đảm bảo bạn có django.template.loaders.app_directories.Loadertrong danh sách TEMPLATE_LOADERS của mình.


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

4

Kiểm tra quyền trên các mẫu và thư mục tên ứng dụng, với ls -l hoặc thử thực hiện một đường dẫn tuyệt đối mở () từ django.


4

Nó hoạt động ngay sau khi tôi thử

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

Nó thật kì 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ộ để có thể truy cập tất cả các tệp tĩnh nhưng trên máy chủ từ xa thì tất cả đều là "root: root".

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

Máy cục bộ chạy trên phiên bản máy tính để bàn Ubuntu 8.04. Máy chủ từ xa là trên phiên bản máy chủ Ubuntu 9.04.

Có ai biết tại sao không?


4

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

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

dòng vào khối Mẫu trong settings.py Và nó hoạt động tốt


3

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

Để sử dụng API tải mẫu, bạn sẽ cần nói với khung nơi bạn lưu trữ các mẫu của mình. Nơi để làm điều này là trong tệp cài đặt của bạn ( settings.py) bởiTEMPLATE_DIRS cài đặt. Theo mặc định, đây là một bộ dữ liệu trống, vì vậy cài đặt này cho biết cơ chế tải mẫu của Django nơi tìm mẫu.

Chọn một thư mục mà bạn muốn lưu trữ các mẫu của mình và thêm nó vào TEMPLATE_DIRS, vd:

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

1

Xem thư mục django thử tải mẫu xem Template-loader postmortemtrong trang lỗi, ví dụ, lỗi sẽ giảm bớt 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.htmlkhông có trong đường dẫn.
Sau đó thay đổi TEMPLATEStrong setting.pytệp thành đường dẫn mẫu của bạn

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

1

Tôi phải sử dụng các mẫu cho một ứng dụng nội bộ và nó hoạt động với tôi:

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

1

Đảm bảo bạn đã thêm ứng dụng của mình vào project-name/app-namme/settings.py INSTALLED_APPS : .

INSTALLED_APPS = ['app-name.apps.AppNameConfig']

Và trên project-name/app-namme/settings.py MẪU : .

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

0

Kiểm tra xem samples.html của bạn có trong /usr/lib/python2.5/site-packages/projectname/templatesdir không.


0

Xin chào các bạn tôi đã tìm thấy một giải pháp mới. Trên thực tế, nó được định nghĩa trong một mẫu khác vì vậy thay vì tự xác định TEMPLATE_DIRS, hãy đặt tên đường dẫn thư mục của bạn theo tên: nhập mô tả hình ảnh ở đây


0

Tôi cảm thấy xấu hổ khi thừa nhận điều này, nhưng vấn đề đối với tôi là một mẫu đã được chỉ định ….hmlthay vì ….html. Coi chừng!


0

Tôi đã thêm cái này

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

và nó vẫn hiển thị lỗi, sau đó tôi nhận ra rằng trong một dự án khác, các mẫu đang hiển thị mà không thêm mã đó vào tệp settings.txt nên tôi đã kiểm tra dự án đó và tôi nhận ra rằng tôi đã không tạo môi trường ảo trong dự án này vì vậy tôi đã làm

virtualenv env 

và nó hoạt động, không biết tại sao


0

Tôi đã đưa ra vấn đề này. Đây là cách tôi giải quyết điều này:

Nhìn vào cài đặt của bạn, xác định vị trí TEMPLATESbiến, bên trong TEMPLATE, thêm đường dẫn mẫu của bạn vào DIRSdanh sách. Đối với tôi, đầu tiên tôi đặt đường dẫn mẫu của mình là TEMPLATES_PATH = os.path.join(BASE_DIR,'templates'), sau đó thêm TEMPLATES_PATHvào DIRSdanh sách , 'DIRS':[TEMPLATES_PATH,]. Sau đó khởi động lại máy chủ, ngoại lệ TemplateDoesNotExist không còn nữa. Đó là nó.


0

trong setting.pytập tin của bạn thay thế DIRStrong TEMPLATESmảng với điều này

'DIRS': []

đến đây

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

Nhưng 1 nghĩ bạn cần biết là bạn phải tạo một thư mục có tên templates và nó sẽ nằm trên đường dẫn gốc nếu không bạn phải thay đổi DIRSgiá trị


0

1. tạo một thư mục 'mẫu' trong 'ứng dụng' của bạn (giả sử bạn đã đặt tên cho ứng dụng đó) và bạn có thể đặt tệp html tại đây. Nhưng chúng tôi khuyên bạn nên tạo một thư mục có cùng tên ('ứng dụng') trong thư mục 'mẫu' và chỉ sau đó đặt html ở đó. Vào thư mục 'ứng dụng / mẫu / ứng dụng'

2.now trong 'url' của ứng dụng đặt:

  path('', views.index, name='index'), # in case of  use default server index.html 

3. trong lượt xem của 'ứng dụng' đặt:

from django.shortcuts import render 

def index(request): return
    render(request,"app/index.html")
    # name 'index' as you want
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.