我有两个文件:
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
过滤器似乎也不适用于此处。我不想对内部块中的缩进进行硬编码,因为如果我决定稍后更改基础中的格式和元素,那么会破坏。
答案 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)
答案 2 :(得分:4)
好问题。我相信Jinja2不会这样做。
您需要问自己的主要问题是您希望HTML正确缩进的原因,因为浏览器并不关心。在生产应用程序中,以相反的方式更有效率并剥离所有空白区域以使页面变小。
如果您对在开发期间执行此操作感兴趣,则可以将render_template()
生成的HTML通过BeautifulSoup中的prettify()
等压头传递。我不建议将其用于生产系统,因为您的功能需要更长的时间才能运行。