pythonpyramidchameleontemplate-taltemplate-metal

Python Pyramid - Add multiple chameleon base templates


I am using this procedure to use a base template which the other templates can derive from.

How can I create multiple base templates?


Solution

  • Just register them both:

    from pyramid.renderers import get_renderer
    
    def add_base_template(event):
        base = get_renderer('templates/base.pt').implementation()
        base2 = get_renderer('templates/base2.pt').implementation()
        event.update({'base': base, 'base2': base2})
    

    And then choose which to use in your template for each page:

    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:tal="http://xml.zope.org/namespaces/tal"
          xmlns:metal="http://xml.zope.org/namespaces/metal"
          metal:use-macro="base">
        <tal:block metal:fill-slot="content">
            My awesome content.
        </tal:block>
    </html>
    
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:tal="http://xml.zope.org/namespaces/tal"
          xmlns:metal="http://xml.zope.org/namespaces/metal"
          metal:use-macro="base2">
        <tal:block metal:fill-slot="content">
            Content on a totally different page.
        </tal:block>
    

    I believe a template doesn't have to be the whole HTML element, so you could instead expand 2 macros into the same final template

    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:tal="http://xml.zope.org/namespaces/tal"
          xmlns:metal="http://xml.zope.org/namespaces/metal">
        <body>
            <div metal:use-macro="section1">
                <tal:block metal:fill-slot="content">
                    Content for template "section1".
                </tal:block>
            </div>
            <div metal:use-macro="section2">
                <tal:block metal:fill-slot="content">
                    Content for template "section2".
                </tal:block>
            </div>
        </body>