AppEngine и Django: включая файл шаблона

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

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

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

Обновлено:

Я пытался:

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

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

существует ли файл "templates / fileToInclude.html"?

Carl Meyer 23.01.2009 00:03

Да; и я также поместил файл в корневой каталог. Я пробовал включать как fileToInclude.html, так и templates / fileToInclude.html.

PythonPower 23.01.2009 00:49

Вы используете шаблоны Django 0.96 (включенные в App Engine) или один из помощников App-Engine-Django (в этом случае, какой?)

Nick Johnson 08.06.2009 00:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
3
2 689
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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

Ответ принят как подходящий

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

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

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)

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

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

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

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

Другие вопросы по теме