2010-08-01 104 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

我不认为在Mako中有一种方法可以执行所需的内省(至少不是以任何干净的方式!)。 “显式比隐式更好”远非“黑客” - 它是**正常的**,**推荐的** Python方法 - 所以我只想用你正在努力避免的额外参数,根本不认为它是一个糟糕的解决方案。 – 2010-08-01 17:26:24

+0

我正在使用的应用程序使用'rendertemplate(filename,...)'而不是'.render()'方法,所以我为该函数提供了一个包装器,将模板名称放入参数中。我想可能会为'render'方法做类似的事情。 – 2016-02-10 06:58:24

回答

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(或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'。调整它以适应您的需求。