Jinja保留包含或宏的缩进

Raz*_*zvi 28 templates jinja2

我想知道在文件中添加包含或宏时是否有任何方法可以使用jinja缩进缩进.我想使用jinja生成代码文件.一个例子是

文件:class.html

class MyClass:
     def someOp():
         pass

     {% include "someOp.html" %}
Run Code Online (Sandbox Code Playgroud)

文件:someOp.html

def someOp2():
    pass
Run Code Online (Sandbox Code Playgroud)

模板的结果应该是:

class MyClass:
     def someOp():
         pass

     def someOp2():
         pass
Run Code Online (Sandbox Code Playgroud)

如果有任何方法让jinja在包含文件中每行的include标记之前添加缩进?或者有没有办法自定义jinja来做到这一点?

小智 20

一种方法是将包裹包括在一个宏,则由于宏是一个函数,它的输出可以通过缩进过滤器:

class MyClass:
    def someOp():
        pass

    {% macro someop() %}{% include "someOp.html" %}{% endmacro %}
    {{ someop()|indent }}
Run Code Online (Sandbox Code Playgroud)

默认情况下,'indent'缩进4个空格并且不缩进第一行,您可以使用例如'indent(8)'进一步缩进,请参阅http://jinja.pocoo.org/docs/templates/#list-of-内置过滤器以获取更多详细信息.

如果您要包含的内容被定义为开始的宏,则不需要进一步的包装器宏,您可以直接跳转到使用缩进过滤器.

  • 谢谢你的答案,它似乎几乎就像我需要的那样,但是我可以使用它所在行的缩进级别(而不是明确地说明级别)吗? (19认同)
  • 嗨@Razvi,这个答案会根据您的要求自动缩进:/sf/answers/4061931261/ (2认同)

小智 8

我正在寻找 Jinja2 以实现相同的目标,并得出结论,目前无法将多行块缩进与原始 Jinja 语句对齐。

我已经向 Jinja 发布了一个小的 PR 来添加一个新的语法{%* ... %}{{* ... }}它就是这样做的。详情请参阅 PR:

https://github.com/pallets/jinja/pull/919