added comma
[jinja2.git] / docs / templates.rst
index fe21eefe89179fe3edaa6eae03c88712ac14953e..48429a5880396f7add90bbedd286e272e79827db 100644 (file)
@@ -44,7 +44,7 @@ the details later in that document::
 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.
 
@@ -101,7 +101,7 @@ if printed and that you can iterate over it, but every other operation fails.
 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.
@@ -109,7 +109,7 @@ 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.
 
@@ -142,7 +142,7 @@ by default set to ``{# ... #}``.  This is useful to comment out parts of the
 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 %}
@@ -165,7 +165,7 @@ that block::
     {% 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``.
 
@@ -252,6 +252,14 @@ precedes it.  For better readability statements that start a block (such as
         # 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:
 
@@ -311,7 +319,7 @@ A child template might look like this::
     {% block content %}
         <h1>Index</h1>
         <p class="important">
-          Welcome on my awsome homepage.
+          Welcome on my awesome homepage.
         </p>
     {% endblock %}
 
@@ -346,9 +354,6 @@ If you want to print a block multiple times you can however use the special
     <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
 ~~~~~~~~~~~~
@@ -378,6 +383,48 @@ readability::
 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
 -------------
 
@@ -507,7 +554,7 @@ by using `else`::
         <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
@@ -698,8 +745,7 @@ Extends
 
 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
@@ -734,6 +780,22 @@ examples::
     {% 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
@@ -788,6 +850,10 @@ namespace::
 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:
 
@@ -810,15 +876,16 @@ Here two examples::
 .. 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:
@@ -888,16 +955,16 @@ Math
 ~~~~
 
 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.
@@ -905,26 +972,46 @@ but exists for completeness sake.  The following operators are supported:
 
 //
     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 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.
@@ -970,7 +1057,7 @@ is
 
 ()
     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) }}``.
 
 . / []
@@ -1059,7 +1146,7 @@ The following functions are available in the global scope by default:
     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::
@@ -1087,13 +1174,13 @@ The following functions are available in the global scope by default:
     .. 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::
 
@@ -1174,12 +1261,24 @@ For example you can print a translated string easily this way::
 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
 ~~~~~~~~~~~~~~~~~~~~
@@ -1196,7 +1295,7 @@ Loop Controls
 
 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::
@@ -1211,3 +1310,57 @@ Likewise a look that stops processing after the 10th iteration::
     {% 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.