1

我是金字塔的新手,并在变色龙中使用金字塔。有人可以帮助我如何为页眉和页脚提供一个通用模板以及包含它们的布局。无法弄清楚如何使用包装器。可重用的模板宏也没有多大帮助。终于在金字塔布局上得到了这个添加,这似乎很有希望,但缺乏文档。

更新

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

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

2 回答 2

3

由于 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它会允许你用父模板提供的内容填充......错误......宏中的插槽

于 2013-09-25T21:44:42.543 回答
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>
于 2013-09-26T08:09:48.560 回答