614
617
<p>and you’re now a template inheritance ninja!</p>
619
<div class="section" id="using-include-with-template-inheritance">
620
<h2>Using <tt class="docutils literal"><span class="pre"><%include></span></tt> with Template Inheritance<a class="headerlink" href="#using-include-with-template-inheritance" title="Permalink to this headline">¶</a></h2>
621
<p>A common source of confusion is the behavior of the <tt class="docutils literal"><span class="pre"><%include></span></tt> tag,
622
often in conjunction with its interaction within template inheritance.
623
Key to understanding the <tt class="docutils literal"><span class="pre"><%include></span></tt> tag is that it is a <em>dynamic</em>, e.g.
624
runtime, include, and not a static include. The <tt class="docutils literal"><span class="pre"><%include></span></tt> is only processed
625
as the template renders, and not at inheritance setup time. When encountered,
626
the referenced template is run fully as an entirely separate template with no
627
linkage to any current inheritance structure.</p>
628
<p>If the tag were on the other hand a <em>static</em> include, this would allow source
629
within the included template to interact within the same inheritance context
630
as the calling template, but currently Mako has no static include facility.</p>
631
<p>In practice, this means that <tt class="docutils literal"><span class="pre"><%block></span></tt> elements defined in an <tt class="docutils literal"><span class="pre"><%include></span></tt>
632
file will not interact with corresponding <tt class="docutils literal"><span class="pre"><%block></span></tt> elements in the calling
634
<p>A common mistake is along these lines:</p>
635
<div class="highlight-mako"><div class="highlight"><pre><span class="cp">## partials.mako</span><span class="x"></span>
636
<span class="cp"><%</span><span class="nb">block</span> <span class="na">name=</span><span class="s">"header"</span><span class="cp">></span><span class="x"></span>
637
<span class="x"> Global Header</span>
638
<span class="cp"></%</span><span class="nb">block</span><span class="cp">></span>
640
<span class="cp">## parent.mako</span><span class="x"></span>
641
<span class="cp"><%</span><span class="nb">include</span> <span class="na">file=</span><span class="s">"partials.mako"</span><span class="cp">></span>
643
<span class="cp">## child.mako</span><span class="x"></span>
644
<span class="cp"><%</span><span class="nb">inherit</span> <span class="na">file=</span><span class="s">"parent.mako"</span><span class="cp">></span><span class="x"></span>
645
<span class="cp"><%</span><span class="nb">block</span> <span class="na">name=</span><span class="s">"header"</span><span class="cp">></span><span class="x"></span>
646
<span class="x"> Custom Header</span>
647
<span class="cp"></%</span><span class="nb">block</span><span class="cp">></span><span class="x"></span>
650
<p>Above, one might expect that the <tt class="docutils literal"><span class="pre">"header"</span></tt> block declared in <tt class="docutils literal"><span class="pre">child.mako</span></tt>
651
might be invoked, as a result of it overriding the same block present in
652
<tt class="docutils literal"><span class="pre">parent.mako</span></tt> via the include for <tt class="docutils literal"><span class="pre">partials.mako</span></tt>. But this is not the case.
653
Instead, <tt class="docutils literal"><span class="pre">parent.mako</span></tt> will invoke <tt class="docutils literal"><span class="pre">partials.mako</span></tt>, which then invokes
654
<tt class="docutils literal"><span class="pre">"header"</span></tt> in <tt class="docutils literal"><span class="pre">partials.mako</span></tt>, and then is finished rendering. Nothing
655
from <tt class="docutils literal"><span class="pre">child.mako</span></tt> will render; there is no interaction between the <tt class="docutils literal"><span class="pre">"header"</span></tt>
656
block in <tt class="docutils literal"><span class="pre">child.mako</span></tt> and the <tt class="docutils literal"><span class="pre">"header"</span></tt> block in <tt class="docutils literal"><span class="pre">partials.mako</span></tt>.</p>
657
<p>Instead, <tt class="docutils literal"><span class="pre">parent.mako</span></tt> must explicitly state the inheritance structure.
658
In order to call upon specific elements of <tt class="docutils literal"><span class="pre">partials.mako</span></tt>, we will call upon
659
it as a namespace:</p>
660
<div class="highlight-mako"><div class="highlight"><pre><span class="cp">## partials.mako</span><span class="x"></span>
661
<span class="cp"><%</span><span class="nb">block</span> <span class="na">name=</span><span class="s">"header"</span><span class="cp">></span><span class="x"></span>
662
<span class="x"> Global Header</span>
663
<span class="cp"></%</span><span class="nb">block</span><span class="cp">></span>
665
<span class="cp">## parent.mako</span><span class="x"></span>
666
<span class="cp"><%</span><span class="nb">namespace</span> <span class="na">name=</span><span class="s">"partials"</span> <span class="na">file=</span><span class="s">"partials.mako"</span><span class="cp">/></span><span class="x"></span>
667
<span class="cp"><%</span><span class="nb">block</span> <span class="na">name=</span><span class="s">"header"</span><span class="cp">></span><span class="x"></span>
668
<span class="x"> </span><span class="cp">${</span><span class="n">partials</span><span class="o">.</span><span class="n">header</span><span class="p">()</span><span class="cp">}</span><span class="x"></span>
669
<span class="cp"></%</span><span class="nb">block</span><span class="cp">></span>
671
<span class="cp">## child.mako</span><span class="x"></span>
672
<span class="cp"><%</span><span class="nb">inherit</span> <span class="na">file=</span><span class="s">"parent.mako"</span><span class="cp">></span><span class="x"></span>
673
<span class="cp"><%</span><span class="nb">block</span> <span class="na">name=</span><span class="s">"header"</span><span class="cp">></span><span class="x"></span>
674
<span class="x"> Custom Header</span>
675
<span class="cp"></%</span><span class="nb">block</span><span class="cp">></span><span class="x"></span>
678
<p>Where above, <tt class="docutils literal"><span class="pre">parent.mako</span></tt> states the inheritance structure that <tt class="docutils literal"><span class="pre">child.mako</span></tt>
679
is to participate within. <tt class="docutils literal"><span class="pre">partials.mako</span></tt> only defines defs/blocks that can be
680
used on a per-name basis.</p>
681
<p>Another scenario is below, which results in both <tt class="docutils literal"><span class="pre">"SectionA"</span></tt> blocks being rendered for the <tt class="docutils literal"><span class="pre">child.mako</span></tt> document:</p>
682
<div class="highlight-mako"><div class="highlight"><pre><span class="cp">## base.mako</span><span class="x"></span>
683
<span class="cp">${</span><span class="bp">self</span><span class="o">.</span><span class="n">body</span><span class="p">()</span><span class="cp">}</span><span class="x"></span>
684
<span class="cp"><%</span><span class="nb">block</span> <span class="na">name=</span><span class="s">"SectionA"</span><span class="cp">></span><span class="x"></span>
685
<span class="x"> base.mako</span>
686
<span class="cp"></%</span><span class="nb">block</span><span class="cp">></span>
688
<span class="cp">## parent.mako</span><span class="x"></span>
689
<span class="cp"><%</span><span class="nb">inherit</span> <span class="na">file=</span><span class="s">"base.mako"</span><span class="cp">></span><span class="x"></span>
690
<span class="cp"><%</span><span class="nb">include</span> <span class="na">file=</span><span class="s">"child.mako"</span><span class="cp">></span>
692
<span class="cp">## child.mako</span><span class="x"></span>
693
<span class="cp"><%</span><span class="nb">block</span> <span class="na">name=</span><span class="s">"SectionA"</span><span class="cp">></span><span class="x"></span>
694
<span class="x"> child.mako</span>
695
<span class="cp"></%</span><span class="nb">block</span><span class="cp">></span><span class="x"></span>
698
<p>The resolution is similar; instead of using <tt class="docutils literal"><span class="pre"><%include></span></tt>, we call upon the blocks
699
of <tt class="docutils literal"><span class="pre">child.mako</span></tt> using a namespace:</p>
700
<div class="highlight-mako"><div class="highlight"><pre><span class="cp">## parent.mako</span><span class="x"></span>
701
<span class="cp"><%</span><span class="nb">inherit</span> <span class="na">file=</span><span class="s">"base.mako"</span><span class="cp">></span><span class="x"></span>
702
<span class="cp"><%</span><span class="nb">namespace</span> <span class="na">name=</span><span class="s">"child"</span> <span class="na">file=</span><span class="s">"child.mako"</span><span class="cp">></span><span class="x"></span>
704
<span class="cp"><%</span><span class="nb">block</span> <span class="na">name=</span><span class="s">"SectionA"</span><span class="cp">></span><span class="x"></span>
705
<span class="x"> </span><span class="cp">${</span><span class="n">child</span><span class="o">.</span><span class="n">SectionA</span><span class="p">()</span><span class="cp">}</span><span class="x"></span>
706
<span class="cp"></%</span><span class="nb">block</span><span class="cp">></span><span class="x"></span>
616
710
<div class="section" id="inheritable-attributes">
617
711
<span id="inheritance-attr"></span><h2>Inheritable Attributes<a class="headerlink" href="#inheritable-attributes" title="Permalink to this headline">¶</a></h2>
618
712
<p>The <a class="reference internal" href="namespaces.html#mako.runtime.Namespace.attr" title="mako.runtime.Namespace.attr"><tt class="xref py py-attr docutils literal"><span class="pre">attr</span></tt></a> accessor of the <a class="reference internal" href="namespaces.html#mako.runtime.Namespace" title="mako.runtime.Namespace"><tt class="xref py py-class docutils literal"><span class="pre">Namespace</span></tt></a> object