Как оценить вложенные шаблоны с переменными, определенными в родительских областях, с помощью Jinja?Python

Программы на Python
Ответить
Anonymous
 Как оценить вложенные шаблоны с переменными, определенными в родительских областях, с помощью Jinja?

Сообщение Anonymous »

У меня есть код Python, использующий Jinja2 без каких-либо фреймворков, например. Колба. Большинство шаблонов представлены в виде простых текстовых файлов, но по соображениям дизайна некоторые фрагменты шаблонов являются динамическими и хранятся в большой структуре данных Python в виде строк.
Эти фрагменты шаблонов в коде Python также содержат вложенные выражения Jinja, поэтому их необходимо визуализировать дважды. Это нормально — мой код выполняет первый проход рендеринга, который объединяет строки из Python, а затем создает новый шаблон из этого первого рендеринга и вызывает render() во второй раз. Небольшой упрощенный код для ясности:

Код: Выделить всё

for page in page_list:
template = jinja_env.get_template( page[ 'template_file' ] + '.html.jinja2' )
rendered_str = template.render( page )
if '{{' in rendered_str:
template = jinja_env.from_string( rendered_str )
rendered_str = template.render( page )
Проблема, с которой я столкнулся, заключается в том, что все мои структуры управления Jinja (цикл for и т. д.) были отрисованы в первом цикле. Второй рендеринг не удался, поскольку части шаблонов из строк Python ссылаются на переменные, которые больше не существуют (в данном случае, переменные-члены из «страницы»). Я экспериментировал с размещением необработанных блоков Jinja в шаблоне верхнего уровня, чтобы сохранить значения для второго прохода. Это работает, но кажется не масштабируемым для произвольного объема данных и очень некрасиво/нечитабельно:

Код: Выделить всё

{% raw %}{% set my_var = {% endraw %}{{ my_var }}{% raw %} %}{% endraw %}
Есть ли известный способ решения этой проблемы с помощью Jinja? Что кажется идеальным, так это способ сказать Jinja неоднократно оценивать блок шаблона (в данном случае содержимое моего блока for), но сохранять существующие переменные в области видимости. Есть ли способ сделать это, которого я не видел, или мне просто нужно переосмыслить структуру данных и подход?

Подробнее здесь: https://stackoverflow.com/questions/798 ... es-with-ji
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»