Django TemplateDoesNotExist?
Моя локальная машина работает под управлением 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/*
Это странно. Мне не нужно делать это на удаленном сервере, чтобы заставить его работать.
Ответы
Ответ 1
Первое решение:
Эти настройки
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__))
Ответ 2
Найдите этот кортеж:
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',
],
},
},
]
Ответ 3
В настройке .py удалить TEMPLATE_LOADERS и TEMPLATE 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
Если вы столкнулись с этой проблемой, когда вы добавляете 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'),
...
]
}
]
Ответ 5
Просто догадайтесь, но посмотрите эту статью о загрузке шаблона Django. В частности, убедитесь, что у вас есть django.template.loaders.app_directories.Loader
в списке TEMPLATE_LOADERS.
Ответ 6
Проверьте разрешения на шаблоны и каталоги имен приложений, либо с помощью ls -l, либо попробуйте выполнить полный путь open() из django.
Ответ 7
Теперь он работает после того, как я попробовал
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.
Кто-нибудь знает почему?
Ответ 8
У меня была неловкая проблема...
Я получил эту ошибку, потому что я торопился и забыл поместить приложение в INSTALLED_APPS
. Вы могли бы подумать, что Django вызовет более описательную ошибку.
Ответ 9
Ошибка Django TemplateDoesNotExist
означает, что инфраструктура не может найти файл шаблона.
Чтобы использовать API-интерфейс для загрузки шаблона, вам нужно указать структуру, в которой вы храните свои шаблоны. Место для этого - в файле настроек (settings.py
) с помощью параметра TEMPLATE_DIRS
. По умолчанию это пустой кортеж, поэтому этот параметр указывает механизм загрузки шаблона Django, где искать шаблоны.
Выберите каталог, в котором вы хотите сохранить свои шаблоны, и добавьте его в TEMPLATE_DIRS, например:
TEMPLATE_DIRS = (
'/home/django/myproject/templates',
)
Ответ 10
Для версии django 1.9 я добавил
'DIRS': [os.path.join(BASE_DIR, 'templates')],
в блок шаблонов в settings.py
И он хорошо работал
Ответ 11
Убедитесь, что ваш templates.html находится в директории /usr/lib/python2.5/site-packages/projectname/templates
.
Ответ 12
Посмотрите, какая папка 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')],
...
Ответ 13
Привет, ребята, я нашел новое решение. На самом деле это определено в другом шаблоне, поэтому вместо того, чтобы сами определять TEMPLATE_DIRS, укажите путь к вашему каталогу:
![введите описание изображения здесь]()
Ответ 14
Я должен использовать шаблоны для внутреннего приложения, и это работает для меня:
'DIRS': [os.path.join(BASE_DIR + '/THE_APP_NAME', 'templates')],
Ответ 15
Мне стыдно признать это, но проблема для меня заключалась в том, что шаблон был указан как ….hml
вместо ….html
. Осторожно!
Ответ 16
пример
├── mysite
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── elite_schedule
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── templates
│ │ └── elite_schedule
│ │ └── index.html
│ ├── urls.py
│ └── views.py
Создайте пути внутри проекта следующим образом в файле settings.py
:
BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
Настройка, где найти шаблоны
Вам нужно указать Django для поиска ваших шаблонов в папке шаблонов. Для этого добавьте dir templates в объект TEMPLATES
, отредактировав файл settings.py
как показано жирным шрифтом в следующем примере кода:
'DIRS': [os.path.join(BASE_DIR,'templates')],
При отображении шаблона в представлении укажите свой шаблон в следующем порядке: 'elite_schedule/index.html'
. В этом случае это будет папка шаблонов в приложении, шаблоны приложения elite_schedule находятся по адресу templates/elite_schedule/index.html
.
Если вы попытаетесь указать шаблон визуализации как index.html
вы получите TemplateDoesNotExist
.
def index(request):
"""View function for home page of site."""
.......
# Render the HTML template index.html with the data in the context variable
return render(request, 'elite_schedule/index.html', context=context)
Ответ 17
Я добавил это
TEMPLATE_DIRS = (
os.path.join(SETTINGS_PATH, 'templates'),
)
и это все еще показывало ошибку, тогда я понял, что в другом проекте шаблоны показывались без добавления этого кода в файле settings.py, поэтому я проверил этот проект и понял, что я не создал виртуальную среду в этом проекте, поэтому я сделал
virtualenv env
и это сработало, не знаю почему
Ответ 18
Я придумал эту проблему. Вот как я решил это:
Посмотрите на ваши settings.py, найдите переменную TEMPLATES
,
внутри ШАБЛОНОВ добавьте путь к шаблонам в список DIRS
. Для меня сначала я установил путь к шаблонам как TEMPLATES_PATH = os.path.join(BASE_DIR,'templates')
, затем добавил TEMPLATES_PATH
в список DIRS
, 'DIRS':[TEMPLATES_PATH,]
.
Затем перезапустите сервер, исключение TemplateDoesNotExist пропало.
Это.
Ответ 19
в вашем setting.py
файле замените DIRS
в массиве TEMPLATES
этим
'DIRS': []
к этому
'DIRS': [os.path.join(BASE_DIR, 'templates')],
но я думаю, тебе нужно знать, что
Вы должны создать папку с именем templates
, и она должна быть в корневом пути, иначе вам придется изменить значение DIRS
.
Ответ 20
1. Создайте папку "Шаблоны" в вашем "приложении" (скажем, вы назвали так ваше приложение)
и вы можете поместить файл HTML здесь.
Но настоятельно рекомендуется создать папку с тем же именем ('app') в папке 'templates' и только потом помещать туда htmls. В папку "app/templates/app"
2. Теперь в "app" urls.py вставьте:
path('', views.index, name='index'), # in case of use default server index.html
3. в "app" views.py положить:
from django.shortcuts import render
def index(request): return
render(request,"app/index.html")
# name 'index' as you want