1

私はピラミッドの初心者で、カメレオンでピラミッドを使用しています。ヘッダーとフッターの共通テンプレートとそれらを含むレイアウトを作成する方法を教えてください。ラッパーの使用方法を正確に理解できませんでした。再利用可能なテンプレート マクロもあまり役に立ちませんでした。最後に、このアドオンをピラミッド レイアウトに追加しました。これは有望なようですが、ドキュメントがありません。

アップデート

ヘッダーとフッターを別のテンプレート ファイルとして含めるには、Mako と jinja2 には組み込みの方法がありますが、私のようにカメレオン スタイルが好きな場合は、マクロを使用する必要があります。

  • Chameleon: マクロ - //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 の回答またはこの関連する質問を参照してください: 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-slotmetal:fill-slot。これにより、親テンプレートから提供されたコンテンツで...エラー...マクロのスロットを埋めることができます

于 2013-09-25T21:44:42.543 に答える