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 %}