Ответ 1
Технически, поскольку контекст не передается как именованный словарь, требуется небольшая работа для создания списка переменных контекста изнутри шаблона. Однако это возможно.
-
Определите функцию контекста Jinja, чтобы вернуть объект jinja2.Context, который по существу является словарем глобальных переменных/функций
-
Сделать эту функцию доступной в глобальном пространстве имен; то есть словарь jinja2.Environment или jinja2.Template globals
-
Необязательно, фильтровать объекты из контекста; например, используйте
callable()
, чтобы пропустить глобальные вспомогательные функции по умолчанию Jinja (диапазон, столяр и т.д.). Это может быть сделано в контексте функции или шаблона; где это имеет смысл.
Пример:
>>> 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
[В качестве альтернативы вызовите render_response
с помощью ('home.htm', context=context)
, чтобы другое решение работало.]