Django模板引擎缩进

Django模板引擎缩进,django,django-templates,indentation,Django,Django Templates,Indentation,在扩展/包含模板时,我很难让Django的模板引擎正确缩进 这些文件: index.html <html> <body> <div id="hello"> {% block bar %} {% endblock %} {% include 'baz.html'%} </div> </body> </html&g

在扩展/包含模板时,我很难让Django的模板引擎正确缩进

这些文件:

index.html

<html>
    <body>
        <div id="hello">
            {% block bar %}
            {% endblock %}

            {% include 'baz.html'%}
        </div>
    </body>
</html>
{% extends 'foo.html' %}

{% block bar %}
<p>bar</p>
{% endblock %}
<p>baz</p>
baz.html

<html>
    <body>
        <div id="hello">
            {% block bar %}
            {% endblock %}

            {% include 'baz.html'%}
        </div>
    </body>
</html>
{% extends 'foo.html' %}

{% block bar %}
<p>bar</p>
{% endblock %}
<p>baz</p>
baz

将作为

<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个空格)。

Django模板继承不会自动插入缩进。要实现所需的缩进,需要将其包含在
bar.html
中:

{% extends 'foo.html' %}

{% block bar %}
            <p>bar</p>
{% endblock %}
{%extends'foo.html%}
{%block bar%}
酒吧

{%endblock%}
您应该解释缩进需求的目的

缩进在调试步骤中非常有用,但缩进与优化不兼容,因为存在此过滤器

你可以写你自己的剪报:

@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 }}
...

注意,没有测试。另外,我建议您修改snippet,使其仅在调试模式下工作:

您可以像我所做的那样覆盖节点列表的render方法。请参阅我的问题和工作代码:


上面提到的另一个选项是使用Beauty Soup中间件


这是一本书。请注意,人们将此中间件称为“通知”,并建议缓存输出页面。

真的没有其他方法吗?我最终会得到6级缩进的文件..真的。您必须编写自己的
{%block%}
标记。我不知道这有什么关系。不管怎样,浏览器忽略缩进,唯一的原因是为了更容易在文本编辑器中阅读-在那里你无论如何都看不到完整的呈现页面。我在调试时可能会很有用,因为你根本不知道它是如何从django呈现的。这真的只是为了我自己。我不喜欢有这样的文件如果我不得不面对这样的文件,我会想为什么一开始会有这么多的空间。