我正在学习金字塔框架。
到目前为止,我可以为每个视图创建一个单独的模板。
但他们都有相同的头脑内容。
那么,在金字塔中定义父模板的最标准方法是什么?
我发现有一种方法可以通过金字塔事件来完成它:
@subscriber(BeforeRender)
def add_base_template(event):
base = get_renderer('templates/base.pt').implementation()
event.update({'base': base})
但我不喜欢这种做法。
答案 0 :(得分:1)
你想在这里避免使用金字塔事件是正确的。 Pyramid的默认模板语言是Chameleon,您似乎正在使用它,但您可以轻松使用Mako或其他模板语言。重点是:在Pyramid中没有标准的方法来定义父模板,因为它并不关心你使用哪种模板语言。
Chameleon 中的标准方式如下所示。
首先,基本模板 main.pt :
<html>
<head>
Something generic in here...
</head>
<body>
<h1>${document.title}</h1>
<div id="content">
<metal:content define-slot="content" />
</div>
</body>
</html>
示例 child.pt ,首先加载父模板,然后填充内容插槽:
<metal:main use-macro="load: main.pt">
<p metal:fill-slot="content">${structure: document.body}<p/>
</metal:main>
可能的金字塔视图功能:
@view_config(route_name='view_document', renderer='child.pt')
def document_view(request):
foo = Document(title="bar", content="silly example")
return {'document': foo}
当然,这假设我在其他地方定义了一个Document类。 Pyramid代码中仅提及子模板。我的 view_document 函数将文档对象 foo 传递给 child.pt 模板,该模板然后调用 main.pt 模板轮流。
答案 1 :(得分:1)
在讨论布局的金字塔教程中回答了这个问题。您没有要求提供宏,但它们是您目前正在探索的主题。
为什么使用Layouts是一个先进的概念。但是这个想法的实现可能会有所不同,取决于项目的要求和开发人员的技能。
我在自己的项目中使用Layouts,并且不需要知道任何变色龙指令来管理模板的加载。这封装在金字塔附加软件包pyramid_chameleon中。