Я получаю странную ошибку, которая возникает только на живом сервере. Мой каталог шаблонов Django настроен так:
- base.html
- two-column-base.html
- портфель
- экстранет
Страницы портфолио работают корректно локально на нескольких машинах. Они наследуются от корневого base.html или two-column-base.html. Однако теперь, когда я разместил их в live box (локальные машины - Windows, live - в Linux), я получаю TemplateSyntaxError: "Caught TemplateDoesNotExist при рендеринге: base.html" при попытке загрузить любые страницы портфолио. Кажется, это тот случай, когда тег extends не будет работать в этом корневом каталоге (???). Даже если я сделаю direct_to_template для two-column-base.html (который расширяет base.html), я получаю эту ошибку. Все страницы экстрасети работают отлично, но все эти шаблоны находятся в папке / extranet и наследуются от /extranet/base.html.
Возможные проблемы, которые я проверял:
- права доступа к файлам на сервере в порядке
- правильная директория шаблонов на live box (я использую
os.path.dirname(os.path.realpath(__file__))
, чтобы все работало на разных машинах)
- файлы существуют, и каталоги / templates точно соответствуют моей локальной копии
- удаление блока {% extends%} сверху любого поврежденного шаблона приводит к тому, что шаблоны отображаются без проблем
- Ручной запуск сеанса оболочки и вызов get_template для любого из файлов работает, но попытка его визуализации взрывается с тем же исключением в любом из расширенных шаблонов. Делая то же самое с base.html, он рендерит отлично (base.html также рендерит через direct_to_template)
Django 1.2, Python 2.6 на Webfaction. Заранее извиняюсь, потому что это мой третий или четвертый вопрос "я делаю что-то глупое" подряд. Единственный x-фактор, о котором я могу подумать, это то, что я впервые использую Mercurial вместо SVN. Не уверен, как я мог все испортить.
РЕДАКТИРОВАТЬ: Один из возможных источников проблем: локальный компьютер - Python 2.5, live - 2.6.
Вот отрывок из моей попытки рендеринга 'two-column-base.html', который расширяет 'base.html'. Оба файла находятся в одном каталоге, поэтому, если он может найти первый, он может найти второй. c
это просто пустой объект Context.
>>> render_to_string('two-column-base.html', c)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/projectname/webapps/django/lib/python2.6/django/template/loader.py", line 186, in render_to_string
return t.render(context_instance)
File "/home/projectname/webapps/django/lib/python2.6/django/template/__init__.py", line 173, in render
return self._render(context)
File "/home/projectname/webapps/django/lib/python2.6/django/template/__init__.py", line 167, in _render
return self.nodelist.render(context)
File "/home/projectname/webapps/django/lib/python2.6/django/template/__init__.py", line 796, in render
bits.append(self.render_node(node, context))
File "/home/projectname/webapps/django/lib/python2.6/django/template/debug.py", line 72, in render_node
result = node.render(context)
File "/home/projectname/webapps/django/lib/python2.6/django/template/loader_tags.py", line 103, in render
compiled_parent = self.get_parent(context)
File "/home/projectname/webapps/django/lib/python2.6/django/template/loader_tags.py", line 100, in get_parent
return get_template(parent)
File "/home/projectname/webapps/django/lib/python2.6/django/template/loader.py", line 157, in get_template
template, origin = find_template(template_name)
File "/home/projectname/webapps/django/lib/python2.6/django/template/loader.py", line 138, in find_template
raise TemplateDoesNotExist(name)
TemplateSyntaxError: Caught TemplateDoesNotExist while rendering: base.html
Мне интересно, связано ли это как-то с кэшированием шаблонов, которое было только что добавлено в Django.
РЕДАКТИРОВАТЬ 2 (за каждую науку):
настройки шаблона:
import os
PROJECT_ROOT = os.path.dirname(os.path.realpath(__file__))
TEMPLATE_DIRS = (
os.path.join(PROJECT_ROOT, 'templates'),
)
пример просмотра:
def project_list(request, jobs, extra_context={}):
context = {
'jobs': jobs,
}
print context
context.update(extra_context)
return render_to_response('portfolio/index.html', context, context_instance=RequestContext(request))
РЕДАКТИРОВАТЬ: удаленные неработающие ссылки