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
。これにより、親テンプレートから提供されたコンテンツで...エラー...マクロのスロットを埋めることができます