This covers the default settings. The application developer might have
changed the syntax from ``{% foo %}`` to ``<% foo %>`` or something similar.
-There are two kinds of delimiers. ``{% ... %}`` and ``{{ ... }}``. The first
+There are two kinds of delimiters. ``{% ... %}`` and ``{{ ... }}``. The first
one is used to execute statements such as for-loops or assign values, the
latter prints the result of the expression to the template.
Filters
-------
-Variables can by modified by **filters**. Filters are separated from the
+Variables can be modified by **filters**. Filters are separated from the
variable by a pipe symbol (``|``) and may have optional arguments in
parentheses. Multiple filters can be chained. The output of one filter is
applied to the next.
``{{ name|striptags|title }}`` for example will remove all HTML Tags from the
`name` and title-cases it. Filters that accept arguments have parentheses
around the arguments, like a function call. This example will join a list
-by spaces: ``{{ list|join(', ') }}``.
+by commas: ``{{ list|join(', ') }}``.
The :ref:`builtin-filters` below describes all the builtin filters.
template for debugging or to add information for other template designers or
yourself::
- {# note: disabled template because we no longer user this
+ {# note: disabled template because we no longer use this
{% for user in users %}
...
{% endfor %}
{% for item in seq -%}
{{ item }}
{%- endfor %}
-
+
This will yield all elements without whitespace between them. If `seq` was
a list of numbers from ``1`` to ``9`` the output would be ``123456789``.
# endfor
</ul>
+Since Jinja 2.2 line-based comments are available as well. For example if
+the line-comment prefix is configured to be ``##`` everything from ``##`` to
+the end of the line is ignored (excluding the newline sign)::
+
+ # for item in seq:
+ <li>{{ item }}</li> ## this comment is ignored
+ # endfor
+
.. _template-inheritance:
{% block content %}
<h1>Index</h1>
<p class="important">
- Welcome on my awsome homepage.
+ Welcome on my awesome homepage.
</p>
{% endblock %}
<h1>{{ self.title() }}</h1>
{% block body %}{% endblock %}
-Unlike Python Jinja does not support multiple inheritance. So you can only have
-one extends tag called per rendering.
-
Super Blocks
~~~~~~~~~~~~
However the name after the `endblock` word must match the block name.
+Block Nesting and Scope
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Blocks can be nested for more complex layouts. However per default blocks
+may not access variables from outer scopes::
+
+ {% for item in seq %}
+ <li>{% block loop_item %}{{ item }}{% endblock %}</li>
+ {% endfor %}
+
+This example would output empty ``<li>`` items because `item` is unavailable
+inside the block. The reason for this is that if the block is replaced by
+a child template a variable would appear that was not defined in the block or
+passed to the context.
+
+Starting with Jinja 2.2 you can explicitly specify that variables are
+available in a block by setting the block to "scoped" by adding the `scoped`
+modifier to a block declaration::
+
+ {% for item in seq %}
+ <li>{% block loop_item scoped %}{{ item }}{% endblock %}</li>
+ {% endfor %}
+
+When overriding a block the `scoped` modifier does not have to be provided.
+
+
+Template Objects
+~~~~~~~~~~~~~~~~
+
+.. versionchanged:: 2.4
+
+If a template object was passed to the template context you can
+extend from that object as well. Assuming the calling code passes
+a layout template as `layout_template` to the environment, this
+code works::
+
+ {% extends layout_template %}
+
+Previously the `layout_template` variable had to be a string with
+the layout template's filename for this to work.
+
+
HTML Escaping
-------------
<li>{{ user.username|e }}</li>
{% else %}
<li><em>no users found</em></li>
- {% endif %}
+ {% endfor %}
</ul>
It is also possible to use loops recursively. This is useful if you are
The `extends` tag can be used to extend a template from another one. You
can have multiple of them in a file but only one of them may be executed
-at the time. There is no support for multiple inheritance. See the section
-about :ref:`template-inheritance` above.
+at the time. See the section about :ref:`template-inheritance` above.
Block
{% include "sidebar.html" ignore missing with context %}
{% include "sidebar.html" ignore missing without context %}
+.. versionadded:: 2.2
+
+You can also provide a list of templates that are checked for existence
+before inclusion. The first template that exists will be included. If
+`ignore missing` is given, it will fall back to rendering nothing if
+none of the templates exist, otherwise it will raise an exception.
+
+Example::
+
+ {% include ['page_detailed.html', 'page.html'] %}
+ {% include ['special_sidebar.html', 'sidebar.html'] ignore missing %}
+
+.. versionchanged:: 2.4
+ If a template object was passed to the template context you can
+ include that object using `include`.
+
.. _import:
Import
Macros and variables starting with one ore more underscores are private and
cannot be imported.
+.. versionchanged:: 2.4
+ If a template object was passed to the template context you can
+ import from that object.
+
.. _import-visibility:
.. admonition:: Note
In Jinja 2.0 the context that was passed to the included template
- did not include variables define in the template. As a matter of
+ did not include variables defined in the template. As a matter of
fact this did not work::
{% for box in boxes %}
{% include "render_box.html" %}
{% endfor %}
- The included template ``render_box.html`` is not able to access
- `box` in Jinja 2.0, but in Jinja 2.1.
+ The included template ``render_box.html`` is *not* able to access
+ `box` in Jinja 2.0. As of Jinja 2.1 ``render_box.html`` *is* able
+ to do so.
.. _expressions:
~~~~
Jinja allows you to calculate with values. This is rarely useful in templates
-but exists for completeness sake. The following operators are supported:
+but exists for completeness' sake. The following operators are supported:
\+
- Adds two objects with each other. Usually numbers but if both objects are
+ Adds two objects together. Usually the objects are numbers but if both are
strings or lists you can concatenate them this way. This however is not
the preferred way to concatenate strings! For string concatenation have
a look at the ``~`` operator. ``{{ 1 + 1 }}`` is ``2``.
\-
- Substract two numbers from each other. ``{{ 3 - 2 }}`` is ``1``.
+ Substract the second number from the first one. ``{{ 3 - 2 }}`` is ``1``.
/
Divide two numbers. The return value will be a floating point number.
//
Divide two numbers and return the truncated integer result.
- ``{{ 20 / 7 }}`` is ``2``.
+ ``{{ 20 // 7 }}`` is ``2``.
%
- Calculate the remainder of an integer division between the left and right
- operand. ``{{ 11 % 7 }}`` is ``4``.
+ Calculate the remainder of an integer division. ``{{ 11 % 7 }}`` is ``4``.
\*
Multiply the left operand with the right one. ``{{ 2 * 2 }}`` would
- return ``4``. This can also be used to repeat string multiple times.
+ return ``4``. This can also be used to repeat a string multiple times.
``{{ '=' * 80 }}`` would print a bar of 80 equal signs.
\**
Raise the left operand to the power of the right operand. ``{{ 2**3 }}``
would return ``8``.
+Comparisons
+~~~~~~~~~~~
+
+==
+ Compares two objects for equality.
+
+!=
+ Compares two objects for inequality.
+
+>
+ `true` if the left hand side is greater than the right hand side.
+
+>=
+ `true` if the left hand side is greater or equal to the right hand side.
+
+<
+ `true` if the left hand side is lower than the right hand side.
+
+<=
+ `true` if the left hand side is lower or equal to the right hand side.
+
Logic
~~~~~
-For `if` statements / `for` filtering or `if` expressions it can be useful to
-combine group multiple expressions:
+For `if` statements, `for` filtering or `if` expressions it can be useful to
+combine multiple expressions:
and
Return true if the left and the right operand is true.
()
Call a callable: ``{{ post.render() }}``. Inside of the parentheses you
- can use arguments and keyword arguments like in python:
+ can use positional arguments and keyword arguments like in python:
``{{ post.render(user, full=true) }}``.
. / []
loops or over multiple loops.
This is for example very useful if you want to show a list of folders and
- files, with the folders on top, but both in the same list with alteranting
+ files, with the folders on top, but both in the same list with alternating
row colors.
The following example shows how `cycler` can be used::
.. attribute:: current
Returns the current item.
-
+
**new in Jinja 2.1**
.. class:: joiner(sep=', ')
A tiny helper that can be use to "join" multiple sections. A joiner is
- passed a string and will return that string every time it's calld, except
+ passed a string and will return that string every time it's called, except
the first time in which situation it returns an empty string. You can
use this to join things::
To use placeholders you can use the `format` filter::
{{ _('Hello %(user)s!')|format(user=user.username) }}
- or
- {{ _('Hello %s')|format(user.username) }}
For multiple placeholders always use keyword arguments to `format` as other
languages may not use the words in the same order.
+.. versionchanged:: 2.5
+
+If newstyle gettext calls are activated (:ref:`newstyle-gettext`), using
+placeholders is a lot easier:
+
+.. sourcecode:: html+jinja
+
+ {{ gettext('Hello World!') }}
+ {{ gettext('Hello %(name)s!', name='World') }}
+ {{ ngettext('%(num)d apple', '%(num)d apples', apples|count) }}
+
+Note that the `ngettext` function's format string automatically receives
+the count as `num` parameter additionally to the regular parameters.
+
Expression Statement
~~~~~~~~~~~~~~~~~~~~
If the application enables the :ref:`loopcontrols-extension` it's possible to
use `break` and `continue` in loops. When `break` is reached, the loop is
-terminated, if `continue` is eached the processing is stopped and continues
+terminated; if `continue` is reached, the processing is stopped and continues
with the next iteration.
Here a loop that skips every second item::
{% for user in users %}
{%- if loop.index >= 10 %}{% break %}{% endif %}
{%- endfor %}
+
+
+With Statement
+~~~~~~~~~~~~~~
+
+.. versionadded:: 2.3
+
+If the application enables the :ref:`with-extension` it is possible to
+use the `with` keyword in templates. This makes it possible to create
+a new inner scope. Variables set within this scope are not visible
+outside of the scope.
+
+With in a nutshell::
+
+ {% with %}
+ {% set foo = 42 %}
+ {{ foo }} foo is 42 here
+ {% endwith %}
+ foo is not visible here any longer
+
+Because it is common to set variables at the beginning of the scope
+you can do that within the with statement. The following two examples
+are equivalent::
+
+ {% with foo = 42 %}
+ {{ foo }}
+ {% endwith %}
+
+ {% with %}
+ {% set foo = 42 %}
+ {{ foo }}
+ {% endwith %}
+
+.. _autoescape-overrides:
+
+Autoescape Extension
+--------------------
+
+.. versionadded:: 2.4
+
+If the application enables the :ref:`autoescape-extension` one can
+activate and deactivate the autoescaping from within the templates.
+
+Example::
+
+ {% autoescape true %}
+ Autoescaping is active within this block
+ {% endautoescape %}
+
+ {% autoescape false %}
+ Autoescaping is inactive within this block
+ {% endautoescape %}
+
+After the `endautoescape` the behavior is reverted to what it was before.