Мако шаблоны: Как найти название шаблона, в который включен текущий шаблон? - PullRequest
4 голосов
/ 01 августа 2010

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

t1.html:

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

t2.html:

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

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

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

1 Ответ

1 голос
/ 01 августа 2010

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

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

Вот решение на основе стека:

В шаблоне:

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

В файле helpers.py (или w / e подходит для 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']

Это вернет полный URI, однако, как 't1.html'.Настройте его под свои нужды.

...