The Jinja template language is designed to strike a balance between content and application logic.
Here is a small example template:
<!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" lang="en" xml:lang="en">
<head>
<title>My Webpage</title>
</head
<body>
<ul id="navigation">
{% for item in navigation %}
<li><a href="{{ item.href }}">{{ item.caption|escapexml }}</a></li>
{% endfor %}
</ul>
<h1>My Webpage</h1>
{{ variable }}
</body>
</html>
The application developer provides a list of variables called context. Normally there should be a documentation but if you want to know the content of the current context you can add this to your template:
<pre>{% debug %}</pre>
You can print a context variable using {% print var %} or the shortcut form: {{ var }}.
A context isn't flat which means that each variable can has subvariables, as long as it is representable as python data structure.
You can access attributes, dictionary values... using a dot ".":
{{ userlist.0.username }}
--> context['userlist'][0]['username']
{{ object.attribute }}
--> context['object']['attribute']
{{ item.caption }}
--> context['item']['caption']
Jinja provides a simple but powerful filter system, which works like piping on UNIX systems. Here a small example:
{{ variable|replace "search", "replace"|escapexml }}
You can put Whitespaces between filters if you like:
{{ variable | repalce "search", "replace" | escapexml }}
This will look for a variable variable, passes it to the filter replace with the arguments "search" and "replace", and passes the result to the filter escapexml.
For a list of available filters have a look at the filter list.