在扩展/包含模板时,我很难让Django的模板引擎正确缩进
这些文件:
index.html
<html>
<body>
<div id="hello">
{% block bar %}
{% endblock %}
{% include 'baz.html'%}
</div>
</body>
</html>
bar.html
{% extends 'foo.html' %}
{% block bar %}
<p>bar</p>
{% endblock %}
baz.html
<p>baz</p>
将呈现为
<html>
<body>
<div id="hello">
<p>bar</p>
<p>baz</p>
</div>
</body>
</html>
如何修复它以使其呈现为
<html>
<body>
<div id="hello">
<p>bar</p>
<p>baz</p>
</div>
</body>
</html>
手动输入标签不是一种选择。 如果这很重要,我正在使用软标签(4个空格)。
答案 0 :(得分:6)
Django模板继承不会自动插入缩进。要实现您想要的缩进,您需要将其包含在bar.html
:
{% extends 'foo.html' %}
{% block bar %}
<p>bar</p>
{% endblock %}
答案 1 :(得分:3)
你应该解释一下你的缩进需求的目的。
缩进在调试步骤中非常有用,但缩进与优化不兼容,因为它存在spaceless过滤器。
你可以写自己的剪辑:
@register.tag
def myinden(parser, token):
args = token.contents.split()
n = args[1]
nodelist = parser.parse(('endmyinden',))
parser.delete_first_token()
return MyIndenNode(nodelist, n)
class MyIndenNode(Node, n):
def __init__(self, nodelist, n):
self.nodelist = nodelist
self.n = n
def render(self, context):
import re
regex = re.compile("^", re.M)
return re.sub(regex, "\t"*int(self.n),
self.nodelist.render(context).strip())
使用方法:
index.html
{% include 'baz.html' with indentation="8" %}
baz.html
{{ myindent:myindentation }}
...
注意,未经测试。另外,我建议你修改片段只能在调试模式下工作:
答案 2 :(得分:1)
您可以像我完成的那样覆盖NodeList的渲染方法。通过工作代码查看我的问题:
Proper indentation in Django templates (without monkey-patching)?
答案 3 :(得分:1)
上面提到的另一个选择是使用Beautiful Soup中间件。
这是tutorial。请注意,人们将此中间件称为“REALLY SLOW&#39;&#39;和建议缓存输出页面。