Какая структура для генерации отчетов с использованием Jinja2?

#python #python-3.x #jinja2

#python #python-3.x #jinja2

Вопрос:

У меня есть некоторый Python в Jupyter notebooks, который создает сводные таблицы и некоторые графики из данных. Теперь я хочу создавать отчеты в формате PDF на основе этих данных, и я рассматриваю возможность создания HTML с помощью Jinja2 и преобразования этого в PDF.

Я понимаю, что у Jinja может быть базовый шаблон и дочерние шаблоны, которые наследуются от него. Что мне нужно, так это базовый шаблон, который я могу визуализировать, который извлекает HTML из других файлов (чтобы базовый шаблон не был огромным, и я мог отлаживать меньшие фрагменты).

Какой наилучший способ добиться этого?

Ответ №1:

Добрый вечер,

В вашем случае, что бы я сделал, это создал папку с вашими шаблонами.

Например:

 templates
|- base.html
|- my_template.html
|- another_template.html
  

Включить

Решение заключается в использовании include :

Например, в вашем base.html вы бы имели:

 <html>

<head>

</head>

<body>
{% include ['my_template.html', 'another_template.html'] %}
</body>

</html>
  

Здесь мы включаем результаты рендеринга my_template.html и another_template.html в ваш base.html шаблон.

Вам нужно будет предоставить вашей функции визуализации все параметры, необходимые для всех HTML-шаблонов, которые вы хотите отобразить.

Расширяет

С jinja2 вы также можете делать то, что хотите, используя extends емкость.

Итак, допустим, у вас есть шаблон base.html типа:

 <html>

<head>

</head>

<body>
{% block core %}
{{ content }}
{% endblock %}

</body>

</html>
  

Здесь у нас есть блок с именем core .

Затем вы можете в другом шаблоне расширить базовый шаблон и заменить core block чем-то другим, например:

 {% extends "base.html" %}
{% block core %}
<h1>Hello world</h1>
{% endblock %}
  

К сожалению, как вы можете видеть, это означает, что если вам нужны разные фрагменты HTML, вам придется сделать несколько extends .

У вас может быть другой шаблон, который будет расширять предыдущий шаблон, который расширяет базовый.

Руководство

Последнее решение, которое, на мой взгляд, не рекомендуется, но ради этого я представлю его здесь:

Есть base.html такого рода:

 <html>

<head>

</head>

<body>
{% for html in list_html_to_render %}
{{ html }}
{% endfor %}
</body>

</html>
  

Тогда мы больше не используем Jinja2 в этом случае, но мы визуализируем каждый html, содержащийся в list_html_to_render, переданном функции render.

Я надеюсь, что это поможет.

Хорошего дня,

Мои наилучшие пожелания.

Комментарии:

1. Спасибо Гийому — я проверил доступные здесь методы и убедился, что я не упускаю из виду очевидный инструмент. Я не думал, что extends был ответом — включает это. Еще раз спасибо