AppEngine и Django: включая файл шаблона - PullRequest
4 голосов
/ 22 января 2009

Как видно из названия, я использую Google App Engine и Django.

У меня довольно много идентичного кода в моих шаблонах, и я хотел бы уменьшить это, добавив файлы шаблонов. Итак, в моем главном каталоге приложения у меня есть файл обработчика python, основной шаблон и шаблон, который я хочу включить в свой основной шаблон.

Я бы подумал, что включение {% include "fileToInclude.html"%} будет работать само по себе, но это просто ничего не включает. Я предполагаю, что мне нужно что-то настроить, возможно, с помощью TEMPLATE_DIRS, но я не могу понять это самостоятельно.

EDIT:

Я пробовал:

TEMPLATE_DIRS = (os.path.join(os.path.dirname(__file__), 'templates'), )

Но безрезультатно. Я попробую и другие возможности.

Ответы [ 4 ]

3 голосов
/ 22 января 2009

Во-первых, вам следует рассмотреть возможность использования наследования шаблонов вместо тега include, что часто является уместным, но иногда значительно уступает наследованию шаблонов.

К сожалению, у меня нет опыта работы с App Engine, но из моего опыта работы с обычным Django я могу вам сказать, что вам нужно настроить свой список TEMPLATE_DIRS так, чтобы он включал папку, из которой вы хотите включить шаблон, так как вы указано.

1 голос
/ 23 апреля 2011

У меня та же проблема, и я нашел ее в пакете ext.webapp. В файле template.py вы найдете этот комментарий к строке 33:

Django использует глобальные настройки для каталога, в котором он ищет шаблоны. Это не естественно в контексте модуля webapp, поэтому наш метод загрузки принимает полный путь к шаблону, и мы устанавливаем эти параметры на лету автоматически. Потому что мы должны установить и использовать глобальные настройки на каждом вызов метода, этот модуль не является потокобезопасным, хотя это не проблема для приложений.

См. Строку 92 в том же файле. Вы можете видеть, как расправлялись шаблонные каталоги:

directory, file_name = os.path.split(abspath)
new_settings = {
    'TEMPLATE_DIRS': (directory,),
    'TEMPLATE_DEBUG': debug,
    'DEBUG': debug,
    }

ОБНОВЛЕНИЕ: вот обходной путь, который работал для меня - http://groups.google.com/group/google-appengine/browse_thread/thread/c3e0e4c47e4f3680/262b517a723454b6?lnk=gst&q=template_dirs#262b517a723454b6

1 голос
/ 02 февраля 2009

Я обнаружил, что это работает "из коробки", если я сначала не загружаю шаблоны и не рендую их с помощью объекта Context. Вместо этого я использую стандартный метод, показанный в учебнике AppEngine .

0 голосов
/ 25 мая 2010

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

def render(file, map={}):
  return template.render(
    os.path.join(os.path.dirname(__file__), '../templates', file), map)  

table = render("table.html", {"headers": headers, "rows": rows})   
final = render("final.html", {"table": table})

self.response.out.write(final)
...