mako的大多数示例和教程都建议您使用文件作为模板。
如果模板存储在字符串或数据库中,我如何使用继承?
作为一个起点,我尝试基于mako网站上基于文件的继承示例创建基于变量的继承示例(之后可以很容易地将其转换为基于数据库的示例):
from mako.template import Template
base = """
<html>
<body>
<div class="header">
<%block name="header"/>
</div>
Some body content ...
</body>
</html>
"""
index = """
<%inherit file="base.html"/>
<%block name="header">
this is some header content
</%block>
this is the body content.
"""
base_template = Template(base)
index_template = Template(index)
print index_template.render()
显然这不起作用。
第二个模板需要某种方式来知道base.html应该是base_template。
2009年mako-discuss小组也提出了这个问题:
https://groups.google.com/d/topic/mako-discuss/QiwkRu7rTFQ/discussion
这就是迈克尔拜尔写的答案:
模板要涉及到TemplateLookup集合 互相访问。
任何模板都可以使用 “lookup = some_lookup”关键字参数发送给Template,或者通过创建 使用lookup.put直接查找模板字符串(“some 模板名称“,”您的模板“)。
我还不知道如何应用它并将其转换为实际的python代码。
答案 0 :(得分:2)
首先,您需要将${self.body()}
添加到基本模板,这将标记继承者数据将在那里的位置。然后您可以像这样使用TemplateLookup:
from mako.template import Template
from mako.lookup import TemplateLookup
base = """
<html>
<body>
<div class="header">
<%block name="header"/>
</div>
${self.body()}
</body>
</html>
"""
index = """
<%inherit file="base.html"/>
<%block name="header">
this is some header content
</%block>
this is the body content.
"""
lookup = TemplateLookup()
lookup.put_string("base.html", base)
lookup.put_string("index.html", index)
index_template = lookup.get_template("index.html")
print index_template.render()