从Jinja2的父块获取内容

Ser*_*nin 3 python jinja2 flask

我需要通过控制台脚本从Jinja2中的特定块获取内容。例如

//global template
{% block target %}
    <some_content_from_top>
{% endblock %}

//parent template
{% extends 'top.html' %}
{% block target %}
    <some_content_from_parent>
{% endblock %}

//child template
{% extends 'parent.html' %}
{% block target %}
    <some_content>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

我可以使用类似的方法从特定模板的此块中获取内容,而无需继承

template_source = self.env.loader.get_source(self.env, template_path)[0]
parsed_content = self.env.parse(template_source).body
# do something with blck content
Run Code Online (Sandbox Code Playgroud)

但是我如何从所有父模板中获取内容。当然,我可以从Extends块中获取父模板的名称,并一遍又一遍地进行相同的操作,直到获得没有Extends块的顶级模板。但是也许有更有效的方法?

dir*_*irn 5

您可以使用Jinja2的super功能在父模板中包含块中的内容。

top.html

{% block target %}
  <some_content_from_top>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

parent.html

{% extends 'top.html' %}
{% block target %}
  <some_content_from_parent>
  {{ super() }}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

child.html

{% extends 'parent.html' %}
{% block target %}
  {{ super() }}
  <some_content>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

这将导致:

<some_content_from_parent>
<some_content_from_top>
<some_content>
Run Code Online (Sandbox Code Playgroud)