Jinja2正确缩进包含块

时间:2014-02-24 15:08:30

标签: flask 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过滤器似乎也不适用于此处。我不想对内部块中的缩进进行硬编码,因为如果我决定稍后更改基础中的格式和元素,那么会破坏。

3 个答案:

答案 0 :(得分:29)

虽然我认为文档大小的增加是反对“正确”缩进文档的一个很好的论据,jinja2 actually provides a function可以做到你所做的:

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

您将在base.html中使用宏,如this answer on 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) }}

答案 1 :(得分:9)

我知道,这个问题还很老,但是我找到了解决这个问题的好方法。 您可以将过滤器应用于整个文本块:enter image description here

http://example.com#yes

答案 2 :(得分:4)

好问题。我相信Jinja2不会这样做。

您需要问自己的主要问题是您希望HTML正确缩进的原因,因为浏览器并不关心。在生产应用程序中,以相反的方式更有效率并剥离所有空白区域以使页面变小。

如果您对在开发期间执行此操作感兴趣,则可以将render_template()生成的HTML通过BeautifulSoup中的prettify()等压头传递。我不建议将其用于生产系统,因为您的功能需要更长的时间才能运行。