金字塔页眉和页脚的常用模板?

时间:2013-09-25 19:11:55

标签: pyramid

我是金字塔的新手,并使用金字塔与变色龙。有人可以帮助我如何拥有页眉和页脚的通用模板以及包含它们的布局。无法弄清楚如何使用包装器。 Re-usable Template Macros也没有多大帮助。最后得到pyramid-layouts的这个补充,似乎很有希望,但缺乏文档。

更新

包括页眉和页脚作为sepearte模板文件Mako和jinja2有内置的方式,但像我一样,如果你喜欢变色龙风格我们必须使用宏

  • Chameleon:Macros - 访问//chameleon.readthedocs.org/en/latest/reference.html#macros-metal
  • Jinja2:模板 - 访问//jinja.pocoo.org/docs/templates/#import
  • Mako:继承 - 访问//docs.makotemplates.org/en/latest/inheritance.html

2 个答案:

答案 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-slotmetal: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>