Chameleon 2.7.0 以降、load:TALES 式がサポートされているため、マクロ テンプレートを別のテンプレートから直接読み込むことができます。詳細については、@sverbois の回答またはこの関連する質問を参照してください: How to use template inheritance with chameleon?
再利用可能なテンプレート マクロのチュートリアルで説明されている別の古いアプローチでは、参照を解除する必要があるテンプレートを含むクラスを作成し、クラスのインスタンスをビューに渡します。
    class Layouts(object):
        @reify
        def global_macros(self):
            renderer = get_renderer("templates/macros.pt")
            return renderer.implementation().macros
次に、そのレイアウトをビューに渡す必要があります。チュートリアルでは、ビュー クラスを からサブクラス化することでそれを行いました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>
 
(提案されたレイアウトからサブクラス化されたビュー クラスを使用する場合)、または
    <div metal:use-macro="layout.global_macros['company_menu']"></div>
(上記の手順 2 で示したように、関数ベースのビューで Layout オブジェクトをインスタンス化した場合)
それが機能したら、見てみましょmetal:define-slotうmetal:fill-slot。これにより、親テンプレートから提供されたコンテンツで...エラー...マクロのスロットを埋めることができます