Flask Jinja2正确缩进包含的块

Flask Jinja2正确缩进包含的块,flask,jinja2,Flask,Jinja2,我有两个文件: base.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>{{title}}</title> </head> <body> {% block content %} {% endblock %} </body

我有两个文件:

base.html

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

{{title}}
{%block content%}
{%endblock%}
register.html

<!DOCTYPE html>
<html>
    <head>
       <meta charset="UTF-8">
       <title>{{title}}</title>
    </head>
    <body>
       {% block content %}
       {% endblock %}   
    </body>
</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 %}
{%extends“base.html”%}
{%block content%}
登记
{{form.hidden_tag()}}
{{form.login.label}{{form.login(大小=20)}
{{form.password.label}{{form.password(大小=20)}
{%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>

登记
登记
登录
密码

我错过什么了吗?我尝试了谷歌和混乱的模板缩进,而且
indent
过滤器似乎不适用于这里。我不想硬编码内部块中的缩进,因为如果我以后决定更改基本块中的格式和元素,缩进就会中断。

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

您需要问自己的主要问题是,既然浏览器不在乎,为什么希望HTML正确缩进。在生产应用程序中,使用另一种方法,去掉所有空白以使页面更小,效率更高


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

尽管我认为文档大小的增加是反对“正确”缩进文档的一个很好的理由,但要做到以下几点:

indent(s, width=4, indentfirst=False)
base.html
中使用宏,如中所述

无论如何,我可能会将其作为一个宏,并将其称为
render\u register\u 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 %}

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


如果将register.html缩进8个空格,则会得到所需的结果。@voscausa-这正是我想要避免的。
base.html
中的缩进可能会更改。我不想每次都重新编码<代码>登记。HTML < /代码>。我仍然面临这个问题,因为我正试图用JICAN2预告RAML:)我知道OP是,但是要考虑的是不是每个人都在HTML文件中使用金贾。例如,在中,Jinja可以散布在非代码文件中,例如Markdown,其中由于空格而产生的额外制表符缩进非常重要。那么
{%call render\u register\u form(my\u form)%%}
呢?我不确定您的评论是针对@GillBates。。。你能详细说明一下吗?在Jinja2.10上使用缩进可以逃避我的HTML。这正常吗?@Usagi我也有同样的问题,您是否找到了一个解决方案,可以在不转义html语法的情况下使用缩进过滤器,或者如何在以后再次取消浏览您可以在将内容传递到模板之前尝试使用
|safe
过滤器或使用
MarkupSafe.Markup
中的建议。这太棒了,谢谢。我们正在生成云形成,在某些情况下需要包含相同的文件,但在不同的缩进级别,这非常有效。