Jinja allows to move often used parts into external files.
This is an addition to the template inheritance system.
You can predefine blocks for later usage using the tag {% prepare %}:
{% prepare "box" %} <div id="box">this is the default box</div> {% endprepare %} {% prepare "dialog" accepting title, content %} <div id="dialog"> <h1>{{ title|escapexml }}</h1> {% if content" %} <div class="text">{{ content }}</div> {% endif %} </div> {% endprepare %}
You can now display that block everywhere on the same file as long as the block was prepared above the first usage:
<ul> {% for user in users %} <li>{{ user.username }} {% if user.description %} {% call dialog, "User Details", user.description %} {% endif %}</li> {% endfor %} </ul> {% call "box" %}
You can use {% include %} to include files which are loadable by the current loader. That means you include it like you would extend from it:
<h1>Hello World</h1> <div id="intro"> {% include "parts/introtext" %} </div>
{% require %} works like {% include %} but doesn't return the output. This can be useful for loading Predefined Blocks or if you want to write the rendered file into a variable:
{% require "myblocks" %} {% require "parts/introtext" as introtext %} <h1>Hello World</h1> {% call "divbox", "intro", introtext %}
The first require will load "myblocks" and return nothing, the second one will load "parts/introtext" and save the output in a variable "introtext".
Additionally require will only load blocks one time which means fastens up jinja a lot when using the same included file on more than one page.