Jinja2 правильно отступ включен блок

У меня есть два файла:

base.html

<!DOCTYPE html>
<html>
    <head>
       <meta charset="UTF-8">
       <title>{{title}}</title>
    </head>
    <body>
       {% block content %}
       {% endblock %}   
    </body>
</html>

register.html

{% extends "base.html" %}
{% block content %}
<h1>Register</h1>
<form action="" method="post" name="register">
    {{ form.hidden_tag() }}
    {{ form.login.label }} {{ form.login(size=20) }}
    {{ form.password.label }} {{ form.password(size=20) }}
    <input type="submit" value="Register">
</form>
{% endblock %}

Он отображается следующим образом:

<!DOCTYPE html>
<html>
    <head>
       <meta charset="UTF-8">
       <title>Register</title>
    </head>
    <body>

<h1>Register</h1>
<form action="" method="post" name="register">
    <div style="display:none;"><input id="csrf_token" name="csrf_token" type="hidden" value="1393257771.168161##ce877b3519f192c05d3b409f3b7b07bb147dead7"></div>
    <label for="login">login</label> <input id="login" name="login" size="20" type="text" value="">
    <label for="password">password</label> <input id="password" name="password" size="20" type="password" value="">
    <input type="submit" value="Register">
</form>

    </body>
</html>

Я хотел бы добиться этого:

<!DOCTYPE html>
<html>
    <head>
       <meta charset="UTF-8">
       <title>Register</title>
    </head>
    <body>
        <h1>Register</h1>
        <form action="" method="post" name="register">
            <div style="display:none;"><input id="csrf_token" name="csrf_token" type="hidden" value="1393257771.168161##ce877b3519f192c05d3b409f3b7b07bb147dead7"></div>
            <label for="login">login</label> <input id="login" name="login" size="20" type="text" value="">
            <label for="password">password</label> <input id="password" name="password" size="20" type="password" value="">
            <input type="submit" value="Register">
        </form>
    </body>
</html>

Я что-то упустил? Я попробовал Google и возился с отступом шаблона, также фильтр indent, похоже, не применяется здесь. Я не хочу жестко закодировать отступы во внутреннем блоке, так как это сломается, если я решит изменить форматирование и элементы в базе позже.

Ответы

Ответ 1

Хороший вопрос. Я считаю, что Jinja2 этого не делает.

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

Если вы заинтересованы в этом во время разработки, вы можете передать HTML, сгенерированный с помощью render_template() через индентор, такой как prettify() из BeautifulSoup. Я не рекомендую это для производственной системы, так как ваши функции занимают больше времени.

Ответ 2

Хотя я думаю, что увеличение размера документа является хорошим аргументом против "правильных" отступов документов, jinja2 фактически предоставляет функцию, чтобы сделать то, что вы что:

indent(s, width=4, indentfirst=False)

который вы использовали бы в своем base.html с макросом, как описано в этом ответе на SO.

Я бы, вероятно, сделал это макрокомом и назову его render_register_form:

{% macro render_register_form(form) %}
    <h1>Register</h1>
    <form action="" method="post" name="register">
        {{ form.hidden_tag() }}
        {{ form.login.label }} {{ form.login(size=20) }}
        {{ form.password.label }} {{ form.password(size=20) }}
        <input type="submit" value="Register">
    </form>
{% endmacro %}

а затем включить его там, где это необходимо, например, с отступом 8 пробелов, как:

{{ render_register_form(my_form)|indent(8, True) }}

Ответ 3

Я знаю, вопрос довольно старый, но я нашел хорошее решение этой проблемы. Вы можете применять фильтры ко всем текстовым блокам: Документация по шаблонам/Фильтры

{% filter indent(width=4) %}
{% include "./sub-template.yml.j2" %}
{% endfilter %}