Jinja2正确缩进包含块

Fen*_*kso 28 jinja2 flask

我有两个文件:

base.html文件

<!DOCTYPE html>
<html>
    <head>
       <meta charset="UTF-8">
       <title>{{title}}</title>
    </head>
    <body>
       {% block content %}
       {% endblock %}   
    </body>
</html>
Run Code Online (Sandbox Code Playgroud)

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 %}
Run Code Online (Sandbox Code Playgroud)

它像这样呈现:

<!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>
Run Code Online (Sandbox Code Playgroud)

我想实现这个目标:

<!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>
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?我试过谷歌和搞乱模板缩进,也indent过滤器似乎不适用于此.我不想对内部块中的缩进进行硬编码,因为如果我决定稍后更改基本中的格式和元素,那将会破坏.

Mid*_*ter 30

虽然我认为文档大小的增加是反对"正确"缩进文档的一个很好的论据,但jinja2实际上提供了一个函数来完成你的工作:

indent(s, width=4, indentfirst=False)
Run Code Online (Sandbox Code Playgroud)

你将在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 %}
Run Code Online (Sandbox Code Playgroud)

然后将其包含在需要的地方,例如,8个空格缩进,如:

{{ render_register_form(my_form)|indent(8, True) }}
Run Code Online (Sandbox Code Playgroud)


小智 14

I know, the question is rather old but I found a nice solution to this problem. You can apply filters to whole text blocks: Template Designer Documentation / Filters

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