在金字塔框架中使用父模板

时间:2014-04-14 18:53:32

标签: python pyramid

我正在学习金字塔框架。

到目前为止,我可以为每个视图创建一个单独的模板。

但他们都有相同的头脑内容。

那么,在金字塔中定义父模板的最标准方法是什么?

我发现有一种方法可以通过金字塔事件来完成它:

@subscriber(BeforeRender)
def add_base_template(event):
    base = get_renderer('templates/base.pt').implementation()
    event.update({'base': base}) 

但我不喜欢这种做法。

2 个答案:

答案 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中。