Шаблон Django DoesNotExist?


163

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

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

TemplateDoesNotExist в / appname / путь 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/projectname/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/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/*

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


Ваш TEMPLATE_DIRS доступен для чтения веб-сервером?
Джордан Мессина

@Jordan, достаточно TEMPLATE_DIRS, доступной для root. Это то, что он настроен на удаленном сервере, который работает.
Джек,

Ответы:


197

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

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

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__))

3
@jpartogi, я пробовал оба подхода, но ни один не работает. Я даже пытался использовать абсолютный путь к шаблону в аргументе render_to_response (), но все еще не работал.
Джек

Ваш проект Django находится под /usr/lib/python2.5/site-packages/projectname/?
Джошуа Партоги

@jpartogi, да, все установленные приложения находятся в /usr/lib/python2.5/site-packages/projectname/appname1, ...
jack

Можете ли вы отредактировать свой оригинальный пост и вставить settings.py. Исключая конфигурацию БД: -d. Спасибо.
Джошуа Партоги

Поместить каждый шаблон из разных приложений в один каталог templates- не очень хороший дизайн. Но, как я знаю, после добавления вашего APP_NAMEв settings.py, djangoможно перейти к поиску шаблона приложения в каталоге, который находится в APP_DIR. Таким образом, вы можете отделить шаблон для различных приложений. (Джанго 1.7 - .1.9
Олстон

59

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

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

24
SETTINGS_PATHна самом деле нигде не определено, поэтому я не думаю, что этот ответ будет работать. Может быть, вы имели в видуBASE_DIR
мягко

1
define SETTINGS_PATH = os.path.dirname (os.path.dirname ( файл ))
Шапон Пал

1
Я думаю, что Shapon Pal означает SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)), а не файл
микрофон

20

Если вы столкнулись с этой проблемой при добавлении 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'),
                ...
                ]
    }
]

Это было единственное решение, которое работает для меня, используя django 2.2.7
Jhonatas Kleinkauff

1
В моем случае только шаг 2 отсутствовал. массив DIRS, который я мог оставить пустым, и он все еще работал и искал шаблон в правильном каталоге шаблонов приложения.
Шри Шинд

13

Устанавливая .py удалить TEMPLATE_LOADERS и матричную 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',
        ],
    },
 },
]

5

У меня была неловкая проблема ...

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


4

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


Это сработало для меня. Загружает шаблоны из приложений Django в файловую систему. Для каждого приложения в INSTALLED_APPS загрузчик ищет подкаталог шаблонов. Если каталог существует, Django ищет там шаблоны. <br> TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates', 'APP_DIRS': True,}]
Виджей

4

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


4

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

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

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

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

строка в блок шаблонов в settings.py, и это сработало хорошо


3

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

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

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

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

1

Посмотрите, в какую папку django попытается загрузить шаблон, посмотрите на Template-loader postmortemстранице ошибок, например, ошибка будет выглядеть примерно так:

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не в пути.
Затем измените TEMPLATESв setting.pyфайле путь к шаблонам

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

1

Я должен использовать шаблоны для внутреннего приложения, и это работает для меня:

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

1

Убедитесь , что вы добавили приложение к project-name/app-namme/settings.py INSTALLED_APPS: .

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

И project-name/app-namme/settings.py ШАБЛОНЫ: .

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


0

Привет, ребята, я нашел новое решение. На самом деле он определен в другом шаблоне, поэтому вместо того, чтобы определять TEMPLATE_DIRS самостоятельно, укажите путь к каталогу по адресу: введите описание изображения здесь


0

Мне стыдно признаться в этом, но проблема для меня заключалась в том, что шаблон был указан как ….hmlвместо ….html. Осторожно!


0

Я добавил это

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

и это все еще показывало ошибку, тогда я понял, что в другом проекте шаблоны показывались без добавления этого кода в файле settings.py, поэтому я проверил этот проект и понял, что я не создал виртуальную среду в этом проекте, поэтому я сделал

virtualenv env 

и это сработало, не знаю почему


0

Я придумал эту проблему. Вот как я решил это:

Посмотрите на ваши settings.py, найдите TEMPLATESпеременную, внутри ШАБЛОНОВ, добавьте путь к шаблонам внутри DIRSсписка. Для меня сначала я задаю путь к шаблонам как TEMPLATES_PATH = os.path.join(BASE_DIR,'templates'), а затем добавляю TEMPLATES_PATHв DIRSсписок 'DIRS':[TEMPLATES_PATH,]. Затем перезапустите сервер, исключение TemplateDoesNotExist пропало. Вот и все.


0

в вашем setting.pyфайле замените DIRSв TEMPLATESмассиве этим

'DIRS': []

к этому

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

но я думаю, вам нужно знать, что вы должны создать папку с именем, templates и она должна быть в корневом пути, иначе вам придется изменить DIRSзначение


0

1. Создайте папку «templates» в вашем «приложении» (скажем, вы назвали так ваше приложение), и вы можете поместить html-файл здесь. Но настоятельно рекомендуется создать папку с тем же именем ('app') в папке 'templates' и только потом помещать туда htmls. В папку «app / templates / app»

2. Теперь в url.py приложения приложите:

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

3. в 'views' 'приложения добавьте:

from django.shortcuts import render 

def index(request): return
    render(request,"app/index.html")
    # name 'index' as you want
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.