Jinja2 模板中包含的变量

1 投票
1 回答
1719 浏览
提问于 2025-05-01 02:08

我有一个父模板,其中有一个设置变量,这个模板还包含几个子模板,我想在这些子模板中重复使用这个变量。可惜的是,在子模板里这个变量是空的。该怎么解决呢?

<!-- index.html -->
{%- set title= ' :: '.join((caption, page_title or '')) -%}
{%- set description= ' :: '.join((desc, meta_desc or '')) -%}
{%- block page_header -%}
  {% include 'parts/_header.html' %}

  <!-- I also tried do it with context without luck -->
  {% include 'parts/_header.html' %}
{%- endblock page_header -%}



<!-- parts/header.html -->
<header class="header-wrapper">
  <div class="header">
    <div class="title"><h1 class="title">{{ title|safe }}</h1></div>
    <div class="description">{{ description|safe }}</div>
  </div>
</header>

更新:经过小范围的研究,我发现问题和 {% block %} 部分有关——如果 include 标签在 block 之外,它就能获取到文档的上下文。但出于某些原因,我想把它放在 block 里面。

暂无标签

1 个回答

2

根据我的经验,可以通过把你的 {% set %} 声明放在 {% block %} 声明里面来解决这个问题。在你的例子中:

<!-- index.html -->
{%- block page_header -%}
  {%- set title= ' :: '.join((caption, page_title or '')) -%}
  {%- set description= ' :: '.join((desc, meta_desc or '')) -%}
  {% include 'parts/_header.html' %}
{%- endblock page_header -%}

如果你需要在块外也设置相同的变量,我建议你把同样的代码写两遍,一次放在块外,一次放在块内。虽然这样做看起来不太完美,但我不知道还有其他更好的方法。

撰写回答