TemplateDoesNotExist в /my_app_name, но после вскрытия загрузчика шаблонов пишет (Файл существует)

Я получаю следующую ошибку:

TemplateDoesNotExist в /app1/1/about/

индекс/index.html

но вскрытие загрузчика шаблонов говорит:

/var/www/web/sites/mysite.com/app1/templates/index/index.html (файл существует)

Я перепробовал все ответы stackoverflow на похожие вопросы, но они у меня не сработали. На моем локальном сервере (под управлением OSX, virtualenv) все в порядке, но на рабочем сервере я получаю эту ошибку. На рабочем сервере я использую Django 1.7.5 на Ubuntu 14 с virtualenv. У каждого приложения свой шаблон, структура такая:

app1
--templates
----index
------index.html
------head.html views.py app2
--templates
----index
------index.html
------head.html views.py

В settings.py у меня есть следующие параметры для шаблонов:

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
TEMPLATE_DEBUG = True
TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates'),]
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
)
INSTALLED_APPS = (
    # django
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
     # widgets
     'widget_tweaks',
     'compressor',
     'tinymce',
     'django_activeurl',
     'debug_toolbar',
     # modules
     'app1',
     'app2',
 )

и включая их в представления, подобные этому:

template_event = loader.get_template('index/materials.html', dirs=["app1/templates/"])

person makarqa    schedule 27.08.2015    source источник
comment
TemplateDoesNotExist в /app1/1/about/index/index.html. Перед первым «индексом» есть пробел   -  person Alexander Sysoev    schedule 27.08.2015
comment
У вас нет каталога с именем index/, если только вы не включили его в свой пример.   -  person Burhan Khalid    schedule 27.08.2015
comment
Но.. на локальном сервере все работает нормально, я запутался.   -  person makarqa    schedule 27.08.2015
comment
Я думал, что проблема в путях, но почему он говорит, что файл существует...   -  person makarqa    schedule 27.08.2015
comment
Указание dirs в load_templates необычно. Если ваши настройки верны, это не должно требоваться. Использование относительного каталога 'app1/templates/' может вызвать проблемы.   -  person Alasdair    schedule 27.08.2015
comment
без этого параметра загрузчик получает шаблоны из корневой папки проекта, единственное решение, которое я вижу, - это назвать шаблоны, такие как «app1_index» и т. д.   -  person makarqa    schedule 27.08.2015
comment
Также убедитесь, что все заглавные буквы совпадают. Ubuntu чувствителен к регистру, но ваша среда разработки на Mac нечувствительна к регистру.   -  person Alasdair    schedule 27.08.2015
comment
сообщение о том, что файл существует, я думаю, означает, что шаблон найден, но не может быть загружен, не так ли?   -  person makarqa    schedule 27.08.2015
comment
Обычно рекомендуется поместить подкаталог app1, то есть app1/templates/app1/, и загрузить app1/index/materials.html. Тогда dirs необязателен, в load_templates, и шаблон нужно загрузить из правильной директории.   -  person Alasdair    schedule 27.08.2015
comment
Я пропустил это, когда отправил вопрос. У меня такая же структура, как вы говорите...   -  person makarqa    schedule 27.08.2015
comment
Да, «Файл существует» предполагает, что шаблон может быть найден, но не загружен. Проверьте его владельца и разрешения и убедитесь, что он не include и не расширяет другой несуществующий шаблон.   -  person Alasdair    schedule 27.08.2015
comment
Хорошо, попробую изменить права... Спасибо за ответ!   -  person makarqa    schedule 27.08.2015
comment
У вас есть каталог templates, который не находится ни в одном каталоге приложений?   -  person Burhan Khalid    schedule 27.08.2015
comment
да, у меня в корне проекта, но на локальном сервере все работает.   -  person makarqa    schedule 27.08.2015
comment
Изменение прав доступа к папке не работает.   -  person makarqa    schedule 27.08.2015


Ответы (2)


Вы запутали загрузчик шаблона, передав аргумент dirs, который переопределяет все, что находится в TEMPLATE_DIRS.

Во-первых, вам не нужно устанавливать TEMPLATE_DIRS, если все ваши шаблоны включены в каталоги приложений. Переменная TEMPLATE_DIRS существует, если вы хотите загружать шаблоны из других расположений файловой системы. Если все ваши шаблоны находятся в app/templates/, то вам не нужно устанавливать TEMPLATE_DIRS.

Поскольку вы пытаетесь загрузить шаблон, являющийся частью приложения, просто передайте относительный путь к шаблону:

template_event = loader.get_template('index/materials.html')

Теперь вот что собирается делать django (очень упрощенно):

  1. Сначала он просматривает TEMPLATE_LOADERS, а затем вызывает каждый загрузчик для своих шаблонов. Первый загрузчик — это загрузчик файловой системы, который будет использовать настройку TEMPLATE_DIRS для поиска любых шаблонов. Если шаблон здесь соответствует пути, то он остановится.

  2. Следующий загрузчик — это загрузчик app_directories, этот загрузчик будет искать каталог с именем templates в любом приложении, добавленном в INSTALLED_APPS, а затем вернет первый соответствующий шаблон.

Постмартем говорит вам, что загрузчики нашли ваш шаблон, но так, как вы просите их загрузить шаблоны - они не могут найти шаблон.

person Burhan Khalid    schedule 27.08.2015
comment
Это частично сработало, но теперь я получаю ошибку в шаблоне, включая файл из другого приложения... {% include misc/menu.html %}, та же самая ошибка templatedoesntexists - person makarqa; 27.08.2015
comment
Это что-то совсем другое. - person Burhan Khalid; 27.08.2015
comment
Странная логика джанго, я думаю. На мой взгляд, это должно действовать так: попробуйте найти шаблон из каталогов TEMPLATE_DIRS, а если шаблона нет, загрузите его из каталогов INSTALLED_APPS, но все равно спасибо за ответ. Отметит это как ответ. - person makarqa; 27.08.2015
comment
Именно так это и работает, но вы передали аргумент dirs, который отключил всю систему. - person Burhan Khalid; 27.08.2015

Только что понял свою ошибку, после глубокого прочтения документации по django понял, что Alsadair был прав со своим ответом в комментариях.

Обычно рекомендуется поместить подкаталог app1, т. е. app1/templates/app1/, и загрузить app1/index/materials.html. Тогда dirs не нужны, в load_templates, и шаблон нужно загрузить из правильного каталога.

person makarqa    schedule 27.08.2015