#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 был ответом — включает это. Еще раз спасибо