【问题标题】:Accessing variables from super blocks in Jinja2从 Jinja2 中的超级块访问变量
【发布时间】:2020-03-28 15:05:38
【问题描述】:

我一直在尝试设计一个带有主模板的多节报告文档:

<html>
  <body>
    {% include "SectionA.html" %}
    {% include "SectionB.html" %}
    ...
  </body>
</html>

其中每个包含的SectionX.html 文件都扩展了base.html 文件。

我想让base.html 设置一系列变量(用于控制流),这些变量可以在SectionX.html 文件中被覆盖。我尝试使用 setVariables 块来完成此操作,但这不起作用。

我的base.html 文件类似于:

{% block setVariables %}
{% set doFoo = False %}
{% set doBar = False %}
{% set bazValues = [] %}
{% endblock setVariables %}

{% if doFoo %}
...

然后在每个扩展文件中覆盖该部分:

{% block setVariables %}
{% set doFoo = sectionFoo %}
{% set doBar = sectionBar %}
{% set bazValues = sectionBaz %}
{% endblock setVariables %}

问题是,doFoo 被设置在两个完全独立的范围内,我还没有找到一种方法来访问另一个范围。我不确定是否有使用我当前策略的解决方法,但如果有任何可能有助于创建这个模块化、多部分的报告,我将不胜感激。

【问题讨论】:

    标签: python html inheritance scope jinja2


    【解决方案1】:

    您可以改用include 标签在当前命名空间中呈现base.html 的内容。

    所以base.html 应该简单地为公共变量设置默认值:

    {% set doFoo = False %}
    {% set doBar = False %}
    {% set bazValues = [] %}
    

    然后在每个单独的 HTML 文件中:

    {% include 'base.html' %}
    

    【讨论】:

    • 这是一个相当不错的解决方案,但如果能够使用extend 覆盖块会很好。有任何想法吗?还是我非常坚持在基本文件中创建一些复杂的控制流?
    • 您可以将变量存储在单独的模板文件中,例如variables.jinja2,专门用于设置与include 标签一起使用的变量,而让base.html 专注于定义基本HTML带有block 标签的模板。然后,每个单独的 HTML 文件将包含 variables.jinja2 并扩展 base.html
    猜你喜欢
    • 1970-01-01
    • 2018-11-20
    • 2017-12-24
    • 2019-04-10
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    相关资源
    最近更新 更多