templatesjinja2

How to get a list of current variables from Jinja 2 template?


If I return a Jinja2 template like so: return render_response('home.htm', **context)

How do then get a list of the variables in context from within the template?


Solution

  • Technically, because context is not passed as a named dictionary, a little work is required to generate a list of the context variables from inside a template. It is possible though.

    1. Define a Jinja context function to return the jinja2.Context object, which is essentially a dictionary of the global variables/functions

    2. Make that function available in the global namespace; i.e. a jinja2.Environment or jinja2.Template globals dictionary

    3. Optionally, filter objects from the context; for instance, use callable() to skip Jinja's default global helper functions (range, joiner, etc.). This may be done in the context function or the template; wherever it makes the most sense.

    Example:

    >>> import jinja2
    >>> 
    >>> @jinja2.contextfunction
    ... def get_context(c):
    ...         return c
    ... 
    >>> tmpl = """ 
    ... {% for key, value in context().items() %}
    ...     {% if not callable(value) %}
    ...         {{ key }}:{{ value }}
    ...     {% endif %}
    ... {% endfor %}
    ... """
    >>> 
    >>> template = jinja2.Template(tmpl)
    >>> template.globals['context'] = get_context
    >>> template.globals['callable'] = callable
    >>>
    >>> context = {'a': 1, 'b': 2, 'c': 3}
    >>> 
    >>> print(template.render(**context))
            a:1
            c:3
            b:2
    

    [Alternately, call render_response with ('home.htm', context=context) to make the other solution work.]