Если я верну шаблон Jinja2 следующим образом: return render_response('home.htm', **context)
Как тогда получить список переменных в контексте из шаблона?
Если я верну шаблон Jinja2 следующим образом: return render_response('home.htm', **context)
Как тогда получить список переменных в контексте из шаблона?
Технически, поскольку контекст не передается как именованный словарь, требуется небольшая работа для создания списка переменных контекста внутри шаблона. Хотя это возможно.
Определите контекстную функцию Jinja, чтобы возвращать jinja2.Context объект, который по сути является словарем глобальных переменных/функций
Сделайте эту функцию доступной в глобальном пространстве имен; то есть глобальный словарь jinja2.Environment или jinja2.Template
При желании отфильтруйте объекты из контекста; например, используйте 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)
, чтобы другое решение заработало.]
callable
ваше решение будет игнорировать функции, которые явно были переданы как часть контекста. Вероятно, это случается не часто, но может иметь значение.
- person Daniel Werner; 21.06.2011
template
является глобальным, get_context()
может вернуть новый словарь, основанный на context
, но без ключей, которые также существуют в template.globals
.
- person Garrett; 21.06.2011
Вот как заставить @crewbum answer работать из приложения Flask:
import jinja2
@jinja2.contextfunction
def get_context(c):
return c
app.jinja_env.globals['context'] = get_context
app.jinja_env.globals['callable'] = callable
Я обнаружил, что @Garrett answer немного сложнее, чем я хотел. Я обнаружил, что могу легко проверить контекст, добавив клон контекста в сам контекст:
contextCopy = dict(context)
context['all'] = contextCopy
А затем красиво распечатать это в моем шаблоне Jinja с помощью <pre>{{ all|pprint }}</pre>
.