如何使用Python模板语言Mako中仅在运行时知道的名称调用模板定义?

时间:2009-05-29 00:10:25

标签: python templates mako

我正在尝试找到一种方法来调用由上下文中可用数据确定的def模板。

编辑:同一问题的简单实例。

可以在上下文中发出对象的值:

# in python
ctx = Context(buffer, website='stackoverflow.com')

# in mako
<%def name="body()">
I visit ${website} all the time.
</%def>

产地:

I visit stackoverflow.com all the time. 

我想根据数据允许自定义输出。

# in python 
ctx = Context(buffer, website='stackoverflow.com', format='text')

# in mako
<%def name="body()">
I visit ${(format + '_link')(website)} all the time. <-- Made up syntax.
</%def>

<%def name='html_link(w)'>
<a href='http://${w}'>${w}</a>
</%def>

<%def name='text_link(w)'>
${w}
</%def>

更改上下文中的format属性应更改

的输出
I visit stackoverflow.com all the time.

I visit <a href='http://stackoverflow.com'>stackoverflow.com</a> all the time.

我在body def中使用的组成语法显然是错误的。我需要动态指定一个模板,然后调用它?

2 个答案:

答案 0 :(得分:1)

玩一些mako的local命名空间,但这是一个有效的例子:

from mako.template import Template
from mako.runtime import Context
from StringIO import StringIO

mytemplate = Template("""
<%def name='html_link(w)'>
<a href='http://${w}'>${w}</a>
</%def>
<%def name='text_link(w)'>
${w}
</%def>
<%def name="body()">
I visit ${getattr(local, format + '_link')(website)} all the time.
</%def>
""")

buf = StringIO()
ctx = Context(buf, website='stackoverflow.com', format='html')
mytemplate.render_context(ctx)
print buf.getvalue()

根据需要,这会发出:

I visit 
<a href='http://stackoverflow.com'>stackoverflow.com</a>
 all the time.

答案 1 :(得分:0)

如果你首先生成模板(来自另一个模板:),然后用你的数据运行它,那该怎么办?