Macros 如何将宏与pyramid/ZPT(变色龙)一起使用

Macros 如何将宏与pyramid/ZPT(变色龙)一起使用,macros,pyramid,chameleon,template-tal,template-metal,Macros,Pyramid,Chameleon,Template Tal,Template Metal,我想使用带有金字塔+ZPT引擎(变色龙)的宏 文档中说“一个页面模板可以容纳多个宏。” 因此,我定义了一个文件 宏.pt: <div metal:define-macro="step-0"> <p>This is step 0</p> </div> <div metal:define-macro="step-1"> <p>This is step 1</p> </div> 到目前为止,我痛

我想使用带有金字塔+ZPT引擎(变色龙)的宏

文档中说“一个页面模板可以容纳多个宏。”

因此,我定义了一个文件
宏.pt

<div metal:define-macro="step-0">
  <p>This is step 0</p>
</div>
<div metal:define-macro="step-1">
  <p>This is step 1</p>
</div>
到目前为止,我痛苦地发现,我不能只说
use macro=“main_template.pt”
,因为变色龙不像Zope那样自动加载模板。因此,我不得不在之前添加
load:
代码段

进入
使用macro=“step-0”
。这将为
步骤-0
引发NameError。我试图用类似于
的东西预加载
宏.pt
,但这没有帮助


如何使用收集在宏摘要文件中的宏?

要在金字塔中使用ZPT宏,需要通过将宏模板,甚至宏本身传递到渲染模板(摘自文档),使渲染模板可以使用宏模板本身

在渲染器将使用的模板中,您应该像这样引用宏。我假设main_template.pt中包含槽“content”的宏名为“global_layout”。把它改成你的名字

<html metal:use-macro="main.macros['global_layout']">
  <div metal:fill-slot="content">
    ...
    <div metal:use-macro="snippets.macros['step-0']"></div>
    ...
  </div>
</html>
我可以解释得更多,但看看这些文件。这里描述了一个类似上述的简单案例

完整的教程也介绍了这个主题。第二个环节将提高你的知识


之后,金字塔文档将提供更多细节。欢迎来到pyramid。

从Zope pagetemplates体验中,我希望tal:define=“macros\u template load:macros.pt”metal:use macro=“macros\u template.macros['step-0']”起作用;每个模板对象都有一个
属性,每个包含的宏都有键。我还没有尝试过变色龙。我如何使用同一个文件中定义的宏呢?我用变色龙文档中提供的信息和我已经提到的链接扩展了答案。下次请再问一个问题。祝您好运。最后两个链接已断开。
from pyramid.renderers import get_renderer
from pyramid.view import view_config

@view_config(renderer='templates/progress.pt')
def my_view(request):
    snippets = get_renderer('templates/macros.pt').implementation()
    main = get_renderer('templates/main_template.pt').implementation()
    return {'main':main,'snippets':snippets}
<html metal:use-macro="main.macros['global_layout']">
  <div metal:fill-slot="content">
    ...
    <div metal:use-macro="snippets.macros['step-0']"></div>
    ...
  </div>
</html>
<div metal:use-macro="template.macros['step-0']">
    <div metal:fill-slot="content">
        added your content
    </div>
</div>
<div metal:define-macro="step-0">
    a placeholder for your content
    <div metal:define-slot="content">
    </div>
</div>
macros = get_renderer('templates/main_template.pt').implementation().macros