2014-02-24 91 views
18

我有两个文件: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> 

我缺少的东西?我试过谷歌和模板缩进,也似乎在这里适用indent过滤器。我不想在内部块中对缩进进行硬编码,因为如果我稍后决定更改基本格式和元素,就会中断缩进。

+0

如果缩进使用8个空格的register.html,你会得到想要的结果。 – voscausa

+0

@voscausa - 这正是我想要避免的。 'base.html'中的缩进可能会改变。我不想每次重新缩进register.html。 – Fenikso

回答

7

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

你需要问自己的主要问题是为什么你要HTML正确缩进,因为浏览器不关心。在生产应用程序中,采用另一种方式更有效率,并去除所有空白区域以使页面变小。

如果您有兴趣在开发过程中进行此操作,那么您可以将render_template()生成的HTML通过BeautifulSoup的prettify()等压头。我不建议将其用于生产系统,因为您的功能运行时间会更长。

+1

我仍然面临这个问题,因为我正在准备与jinja2的RAML :) – DataGreed

+0

我知道OP是,但需要考虑的是不是所有人都在HTML文件中使用Jinja。例如,在[Cookiecutter](https://github.com/audreyr/cookiecutter)中,Jinja可以散布在非代码文件中,例如Markdown,其中由于空白造成的额外制表符缩进非常重要。 –

18

虽然我觉得在文件尺寸的增加是针对“正确”缩进文档的很好的理由,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) }} 
+0

'{%call render_register_form(my_form)%}'? –

+0

我不确定你的评论是在处理@GillBates ...你能否详细说明一下? – Midnighter