2010-08-01 4 views
4

У меня есть несколько шаблонов, которые включают в себя друг с другом, такие как:Шаблоны Mako: как найти имя шаблона, к которому относится текущий шаблон?

t1.html:

... 
<%include file="t2.html" args="docTitle='blablabla'" /> 
... 

t2.html:

<%page args="docTitle='Undefined'"/> 
<title>${docTitle}</title> 
... 

И то, что я хочу сделать, это определить, что t2 входит в t1 (или другой, поэтому я могу использовать его имя). Никакой конкретный способ, описанный в документации, не попал мне на глаза, и я мог бы передать еще один аргумент (например, pagename = 'foobar), но он скорее похож на взлома.

Есть ли способ сделать это, используя простой вызов .render (blabla) для визуализации страницы?

+2

Я не думаю, что в Мако есть способ выполнить требуемую интроспекцию (по крайней мере, не в чистом виде!). «Явный лучше, чем неявный», далек от «взлома» - это ** нормальный **, ** рекомендуется ** подход Python - так что я бы просто пошел с дополнительным аргументом, которого вы стремитесь избежать и не считайте это плохим решением. –

+0

Приложение, в котором я работаю, использует 'rendertemplate (filename, ...)', а не метод '.render()', поэтому я создал оболочку для этой функции, которая помещает имя шаблона в параметр. Я полагаю, что можно было бы сделать что-то подобное для метода «render». –

ответ

1

Насколько я могу судить, mako не предоставляет никакой информации о включенном шаблоне 'parent'. Кроме того, требуется, чтобы удалить любые биты информации из контекста, переданного в включенный файл.

Поэтому единственным решением, которое я вижу, является использование стека CPython, поиск ближайшего шаблона шаблона mako и извлечение из него необходимой информации. Однако это может быть как медленным, так и ненадежным, и я бы советовал идти с явным прохождением имени. Он также использует недокументированные функции mako, которые могут измениться позже.

Вот стек-решение:

В шаблоне:

${h.get_previous_template_name()} # h is pylons-style helpers module. Substitute it with cherrypy appropriate way. 

В helpers.py (или ж/д подходит для CherryPy):

import inspect 

def get_previous_template_name(): 
    stack = inspect.stack() 
    for frame_tuple in stack[2:]: 
     frame = frame_tuple[0] 
     if '_template_uri' in frame.f_globals: 
      return frame.f_globals['_template_uri'] 

Это будет return full uri, однако, как 't1.html'. Подстройте его, чтобы он соответствовал вашим потребностям.

 Смежные вопросы

  • Нет связанных вопросов^_^