Django TemplateDoesNotExist?


163

Моя локальна машина працює під управлінням 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/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, доступного кореневим, достатньо. Це налаштовано на віддаленому сервері, який працює.
джек

Відповіді:


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 (), але все одно не вийшло.
джек

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

@jpartogi, так, усі встановлені програми знаходяться під /usr/lib/python2.5/site-packages/projectname/appname1, ...
гніздо

Чи можете ви відредагувати оригінальну публікацію та вставити налаштування.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
визначити SETTINGS_PATH = os.path.dirname (os.path.dirname ( файл ))
Shapon Pal

1
Я думаю, що Shapon Pal означає SETTINGS_PATH = os.path.dirname(os.path.dirname(__file__)), а не файл
mic

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. Ви могли б подумати, що Джанго призведе до більш описової помилки.


4

Просто підказка, але подивіться цю статтю про завантаження шаблону Django . Зокрема, переконайтеся, що django.template.loaders.app_directories.Loaderу вашому списку TEMPLATE_LOADERS.


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

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

До джанго версії 1.9 я додав

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

рядок до блоку "Шаблони" в settings.py І він працював добре


3

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

Щоб використовувати API завантаження шаблонів, вам потрібно буде повідомити рамки, де ви зберігаєте свої шаблони. Місце для цього - у вашому файлі налаштувань ( settings.py) шляхом TEMPLATE_DIRSналаштування. За замовчуванням це порожній кортеж, тому цей параметр вказує механізму завантаження шаблонів Джанго, де шукати шаблони.

Виберіть каталог, де ви хочете зберігати свої шаблони, і додайте його до 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 TEMPLATES : .

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

0

Переконайтеся, що ваші templates.html знаходяться в /usr/lib/python2.5/site-packages/projectname/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.створіть папку "шаблони" у вашому "додатку" (скажімо, ви назвали таку програму), і ви можете помістити тут файл HTML. Але настійно рекомендується створити папку з такою ж назвою ("додаток") у папці "шаблони" і лише потім помістити туди htmls. У папку "app / templates / app"

2. знаю в urls.py програми "app":

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

3. у "app" 's views.py put:

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.