我是金字塔的新手,并使用金字塔与变色龙。有人可以帮助我如何拥有页眉和页脚的通用模板以及包含它们的布局。无法弄清楚如何使用包装器。 Re-usable Template Macros也没有多大帮助。最后得到pyramid-layouts的这个补充,似乎很有希望,但缺乏文档。
包括页眉和页脚作为sepearte模板文件Mako和jinja2有内置的方式,但像我一样,如果你喜欢变色龙风格我们必须使用宏
答案 0 :(得分:3)
由于Chameleon 2.7.0支持load:
TALES表达式,因此可以直接从另一个模板加载宏模板。有关详细信息,请参阅@sverbois答案或此相关问题:How to use template inheritance with chameleon?
Re-usable Template Macros教程中描述的另一种较旧的方法涉及创建一个类,其中包含需要引用引用并将类的实例传递到视图中的模板:
class Layouts(object):
@reify
def global_macros(self):
renderer = get_renderer("templates/macros.pt")
return renderer.implementation().macros
然后你需要将那个Layouts thingie传递给你的视图。在本教程中,他们通过从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
,这将允许您填充宏中的...错误...插槽从父模板提供的内容< / p>
答案 1 :(得分:1)
你可以简单地拥有像这样的“main.pt”
<!DOCTYPE html>
<html>
<head>
...
</head>
<body>
<div class="header">
My global header
</div>
<metal:block define-slot="content" />
<div class="footer">
My global footer
</div>
</body>
</html>
并在您的视图模板“my_view_template.pt”中使用它,就像这样
<html metal:use-macro="load: main.pt">
<div metal:fill-slot="content">
<p>Hello !!!</p>
</div>
</html>