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

Pyramid 页眉和页脚的金字塔通用模板?,pyramid,Pyramid,我是金字塔的新手,使用金字塔和变色龙。有人能帮助我如何有一个共同的模板页眉和页脚和布局,其中包括他们。无法准确地找出如何使用包装。这也没什么帮助。最终得到了这个附加组件,它看起来很有希望,但缺少文档 使现代化 包括页眉和页脚作为单独的模板文件Mako和jinja2有内置的方式,但像我一样,如果你喜欢变色龙风格,我们必须使用宏 变色龙:宏-访问//Chameleon.readthedocs.org/en/latest/reference.htmlmacros-metal Jinja2:模板-访问/

我是金字塔的新手,使用金字塔和变色龙。有人能帮助我如何有一个共同的模板页眉和页脚和布局,其中包括他们。无法准确地找出如何使用包装。这也没什么帮助。最终得到了这个附加组件,它看起来很有希望,但缺少文档

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

变色龙:宏-访问//Chameleon.readthedocs.org/en/latest/reference.htmlmacros-metal Jinja2:模板-访问//jinja.pocoo.org/docs/Templates/import Mako:Inheritation-访问//docs.makotemplates.org/en/latest/inheritation.html
由于Chameleon 2.7.0支持load:TALES表达式,因此可以直接从另一个模板加载宏模板。有关详细信息,请参阅@sverbois答案或此相关问题:

教程中描述的另一种较旧的方法涉及创建一个类,该类包含需要删除引用的模板,并将该类的实例传递到视图中:

    class Layouts(object):

        @reify
        def global_macros(self):
            renderer = get_renderer("templates/macros.pt")
            return renderer.implementation().macros
然后,您需要将布局内容传递到视图中。在本教程中,他们通过从布局中对视图类进行子分类来实现这一点:

但您也可以将其实例化并直接传递:

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>
如果您使用从布局中派生的视图类(如建议的),或

    <div metal:use-macro="layout.global_macros['company_menu']"></div>
如果您在基于函数的视图中实例化布局对象,如我在上面的步骤2中所示


一旦这项工作,看看金属:定义槽和金属:填充槽,这将允许您填充。。。犯错误包含父模板提供的内容的宏中的插槽自Chameleon 2.7.0以来,支持load:TALES表达式,因此可以直接从另一个模板加载宏模板。有关详细信息,请参阅@sverbois答案或此相关问题:

教程中描述的另一种较旧的方法涉及创建一个类,该类包含需要删除引用的模板,并将该类的实例传递到视图中:

    class Layouts(object):

        @reify
        def global_macros(self):
            renderer = get_renderer("templates/macros.pt")
            return renderer.implementation().macros
然后,您需要将布局内容传递到视图中。在本教程中,他们通过从布局中对视图类进行子分类来实现这一点:

但您也可以将其实例化并直接传递:

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>
如果您使用从布局中派生的视图类(如建议的),或

    <div metal:use-macro="layout.global_macros['company_menu']"></div>
如果您在基于函数的视图中实例化布局对象,如我在上面的步骤2中所示


一旦这项工作,看看金属:定义槽和金属:填充槽,这将允许您填充。。。犯错误宏中包含由父模板提供的内容的插槽

您只需像这样使用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>
<html metal:use-macro="load: main.pt">

<div metal:fill-slot="content">
    <p>Hello !!!</p>
</div>

</html>
并在视图模板my_view_template.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>
<html metal:use-macro="load: main.pt">

<div metal:fill-slot="content">
    <p>Hello !!!</p>
</div>

</html>

您可以简单地使用这样一个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>
<html metal:use-macro="load: main.pt">

<div metal:fill-slot="content">
    <p>Hello !!!</p>
</div>

</html>
并在视图模板my_view_template.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>
<html metal:use-macro="load: main.pt">

<div metal:fill-slot="content">
    <p>Hello !!!</p>
</div>

</html>

您知道可以更改模板引擎吗?如果需要,您可以使用jinja2或mako。@谢谢您的回复:,我知道我可以切换模板引擎。jinja2或mako是否提供嵌入或包含模板文件的选项?在前面的php框架中,我使用了require_once-like函数来包含html文件。我想知道如何用金字塔来完成同样的任务,Jinja2肯定会允许您使用基本布局。mako我想这也会允许的。我问你这个问题,因为我以前也遇到过同样的问题,最后我切换到了其他模板引擎,不记得是哪一个@llazzaro是的,我同意,感谢你们的投入,jijnja2和mako提供了另一个文件的模板。这正是我要寻找的:我找到了这篇非常有用的博客文章。你知道你可以更改模板引擎吗?如果需要,您可以使用jinja2或mako。@谢谢您的回复:,我知道我可以切换模板引擎。jinja2或mako是否提供嵌入或包含模板文件的选项?在前面的php框架中,我使用了require_once-like函数来包含html文件。我想知道如何用金字塔来完成同样的任务,Jinja2肯定会允许您使用基本布局。mako我想这也会允许的。我问你这个问题,因为我以前也遇到过同样的问题,最后我切换到了其他模板引擎,不记得是哪一个@llazzaro是的,我同意,感谢你们的投入,jijnja2和mako提供了另一个文件的模板。这正是我在寻找的:我找到了这篇非常有用的博客文章。谢谢你的回答,我会试试看。但我认为内置一个
从另一个模板加载一个模板的方式,如Jinja2和Mako。感谢您的回答,我将尝试一下。但我认为,像在Jinja2和Mako中那样,使用一种内置的方式从一个模板加载另一个模板将更加容易和易于维护。