.. highlight:: html+jinja .. _variables: Variables --------- Template variables are defined by the context dictionary passed to the template. You can mess around with the variables in templates provided they are passed in by the application. Variables may have attributes or elements on them you can access too. What attributes a variable has depends heavily on the application providing that variable. You can use a dot (``.``) to access attributes of a variable in addition to the standard Python ``__getitem__`` "subscript" syntax (``[]``). The following lines do the same thing:: {{ foo.bar }} {{ foo['bar'] }} It's important to know that the outer double-curly braces are *not* part of the variable, but the print statement. If you access variables inside tags don't put the braces around them. If a variable or attribute does not exist, you will get back an undefined value. What you can do with that kind of value depends on the application configuration: the default behavior is to evaluate to an empty string if printed or iterated over, and to fail for every other operation. .. _notes-on-subscriptions: .. admonition:: Implementation For the sake of convenience, ``foo.bar`` in Jinja2 does the following things on the Python layer: - check for an attribute called `bar` on `foo` (``getattr(foo, 'bar')``) - if there is not, check for an item ``'bar'`` in `foo` (``foo.__getitem__('bar')``) - if there is not, return an undefined object. ``foo['bar']`` works mostly the same with a small difference in sequence: - check for an item ``'bar'`` in `foo`. (``foo.__getitem__('bar')``) - if there is not, check for an attribute called `bar` on `foo`. (``getattr(foo, 'bar')``) - if there is not, return an undefined object. This is important if an object has an item and attribute with the same name. Additionally, the :func:`attr` filter only looks up attributes.