由于 Chameleon 2.7.0 支持load:
TALES 表达式,因此可以直接从另一个模板加载宏模板。有关详细信息,请参阅@sverbois 答案或此相关问题:如何将模板继承与变色龙一起使用?
Re-usable Template Macros教程中描述的另一种较旧的方法涉及创建一个包含需要 bre 引用的模板的类并将该类的实例传递到视图中:
class Layouts(object):
@reify
def global_macros(self):
renderer = get_renderer("templates/macros.pt")
return renderer.implementation().macros
然后,您需要将该 Layouts 东西传递到您的视图中。在教程中,他们通过子类化视图类来做到这一点Layouts
:
from layouts import Layouts
class ProjectorViews(Layouts):
...
但你也可以实例化它并直接传递它:
def blah(context, request):
layouts = Layouts()
return {
(whatever data you want to pass to your template)
layouts=layouts,
}
在您的宏模板metal:define-macro
中,您可以定义一个宏:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:metal="http://xml.zope.org/namespaces/metal"
xmlns:tal="http://xml.zope.org/namespaces/tal">
<metal:company_menu define-macro="company_menu">
<h1>Hi there!</h1>
</metal:company_menu>
</html>
要将宏插入其他模板,只需使用
<div metal:use-macro="view.global_macros['company_menu']"></div>
(如果您按照他们的建议使用从 Layouts 子类化的视图类),或者
<div metal:use-macro="layout.global_macros['company_menu']"></div>
(如果您在基于函数的视图中实例化了 Layout 对象,如我在上面的步骤 2 中所示)
metal:define-slot
一旦它工作了,看看metal:fill-slot
它会允许你用父模板提供的内容填充......错误......宏中的插槽