Шаблон Django DoesNotExist? - PullRequest
       84

Шаблон Django DoesNotExist?

127 голосов
/ 18 декабря 2009

Моя локальная машина работает под управлением Python 2.5 и Nginx в Ubuntu 8.10, а Django собран из последней ствола разработки.

Для каждого URL, который я запрашиваю, выдается:

TemplateDoesNotExist в / appname / path appname / template_name.html

Django попытался загрузить эти шаблоны в следующем порядке: * Использование загрузчика django.template.loaders.filesystem.function: * Использование загрузчика django.template.loaders.app_directories.function:

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

Ищет ли / usr / lib / python2.5 / site-packages / имя проекта / templates / appname / template_name.html в этом случае? Странно то, что этот файл существует на диске. Почему Джанго не может найти его?

Я запускаю то же самое приложение на удаленном сервере с Python 2.6 в Ubuntu 9.04 без такой проблемы. Остальные настройки такие же.

Есть ли что-то неправильно настроенное на моей локальной машине, или что могло вызвать такие ошибки, на которые я должен обратить внимание?

В моем 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'),
)

Нужно искать следующие файлы:

  • / USR / Библиотека / python2.5 / сайт-пакеты / имя_проекта / шаблоны / appname1 / template1.html
  • / USR / Библиотека / python2.5 / сайт-пакеты / имя_проекта / шаблоны / appname1 / template2.html
  • / USR / Библиотека / python2.5 / сайт-пакеты / имя_проекта / шаблоны / appname2 / template3.html
  • ...

Все перечисленные файлы существуют на диске.

решаемые

Теперь работает после того, как я попробовал:

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

Странно. Мне не нужно делать это на удаленном сервере, чтобы он работал.

Ответы [ 16 ]

159 голосов
/ 18 декабря 2009

Первое решение :

Эти настройки

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__))
39 голосов
/ 22 апреля 2015

Найдите этот кортеж:

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

Вам необходимо добавить в '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',
            ],
        },
    },
]
12 голосов
/ 10 марта 2016

В настройках .py удалить TEMPLATE_LOADERS и TIRPLATE 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',
        ],
    },
 },
]
4 голосов
/ 07 сентября 2018

Если вы столкнулись с этой проблемой при добавлении app с нуля. Вероятно, потому, что вы упускаете немного settings. При добавлении app.

необходимо выполнить три шага.

1 、 Создайте каталог и файл шаблона.

Предположим, у вас есть проект с именем mysite и вы хотите добавить app с именем your_app_name. Поместите файл шаблона в mysite/your_app_name/templates/your_app_name следующим образом.

├── 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 、 Добавьте свой app к INSTALLED_APPS.

Изменить settings.py

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

3 、 Добавьте каталог app в DIRS в TEMPLATES.

Изменить settings.py.

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'templates'),
                 os.path.join(BASE_DIR, 'your_app_name', 'templates', 'your_app_name'),
                ...
                ]
    }
]
4 голосов
/ 18 декабря 2009

Теперь работает после того, как я попробовал

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

Странно. Мне не нужно делать это на удаленном сервере, чтобы он работал.

Кроме того, мне нужно выполнить следующую команду на локальном компьютере, чтобы все статические файлы были доступны, но на удаленном сервере все они являются «root: root».

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

Локальный компьютер работает на настольной версии Ubuntu 8.04. Удаленный сервер находится в версии сервера Ubuntu 9.04.

Кто-нибудь знает почему?

4 голосов
/ 18 декабря 2009

Проверьте разрешения для шаблонов и каталогов имен приложений, либо с помощью ls -l, либо попробуйте выполнить абсолютный путь open () из django.

4 голосов
/ 18 декабря 2009

Просто догадка, но зацените эту статью о загрузке шаблона Django . В частности, убедитесь, что в вашем списке TEMPLATE_LOADERS django.template.loaders.app_directories.Loader.

3 голосов
/ 16 марта 2016

Для django версии 1.9 я добавил

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

строка для блока шаблонов в settings.py И это сработало хорошо

3 голосов
/ 07 июня 2014

Django TemplateDoesNotExist Ошибка означает просто, что фреймворк не может найти файл шаблона.

Чтобы использовать API загрузки шаблонов, вам нужно сообщить структуре, где вы храните ваши шаблоны. Это можно сделать в файле настроек (settings.py) с настройкой TEMPLATE_DIRS. По умолчанию это пустой кортеж, поэтому этот параметр сообщает механизму загрузки шаблонов в Django, где искать шаблоны.

Выберите каталог, в котором вы хотите хранить свои шаблоны, и добавьте его в TEMPLATE_DIRS, например:

TEMPLATE_DIRS = (
  '/home/django/myproject/templates',
)
2 голосов
/ 14 сентября 2018

У меня была смущающая проблема ...

Я получил эту ошибку, потому что я торопился и забыл поместить приложение в INSTALLED_APPS. Вы могли бы подумать, что Django вызовет более описательную ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...