Edgewall Software

Version 6 (modified by cmlenz, 18 years ago) (diff)

--

Genshi Recipes: Replacing py:extends with Includes

As noted in GenshiVsKid, Genshi does not support the py:extends directive for template reuse.

This page shows how the example from the Kid language specification translates to a functionally equivalent setup in Genshi.

Assume the following base template, stored as base.html:

<html xmlns:py="http://genshi.edgewall.org/" py:strip="">

  <ul py:def="display_errors(errors)">
    <li py:for="error in errors" py:content="error" />
  </ul>

  <strong py:match="b" py:content="select('text()')" />

</html>

And the following template “extending” that base template, stored as page.html:

<html xmlns:py="http://genshi.edgewall.org/"
      xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include href="base.html" />
  <head>
    <title>Errors</title>
  </head>
  <body>
    <p>The following <b>errors</b> were found:</p>
    ${display_errors(["Field is required", "Must be phone number.."])}
  </body>
</html>

The “trick” here is that the base template is included at the top of the page template. This results in the template function display_errors() being available to the page template, and the match template being applied to the output generated by the page template.

When rendered, these will produce the following output:

<html>
  <head>
    <title>Errors</title>
  </head>
  <body>
    <p>The following <strong>errors</strong> were found:</p>
    <ul>
      <li>Field is required</li><li>Must be phone number..</li>
    </ul>
  </body>
</html>

See also: GenshiRecipes/PyLayoutEquivalent, GenshiRecipes, GenshiVsKid, Genshi XML Template Language