我正在尝试找到一种方法来调用由上下文中可用数据确定的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
中使用的组成语法显然是错误的。我需要动态指定一个模板,然后调用它?
答案 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)
如果你首先生成模板(来自另一个模板:),然后用你的数据运行它,那该怎么办?