Jinja2 中多个同名块

发布于 2024-07-30 14:26:33 字数 491 浏览 8 评论 0原文

Jinja2 中,我有一个如下所示的基本模板:

<title>{% block title %}{% endblock %} - example.com</title>
[...]

<h1> 
  {% block title %}{% endblock %} - example.com
</h1>

Jinja2 然后失败并显示以下消息:

  lines = [self.message, '  ' + location]
: block 'title' defined twice

它必须是现在很明显我想要做什么 - 在两个地方具有相同的标题:TITLE 标签和 H1 标签,但标题的部分实际上是由其他派生模板提供的。

通常如何实现这一目标?

In Jinja2, I have a base template like this:

<title>{% block title %}{% endblock %} - example.com</title>
[...]

<h1> 
  {% block title %}{% endblock %} - example.com
</h1>

Jinja2, then, fails with the following message:

  lines = [self.message, '  ' + location]
: block 'title' defined twice

It must be now evident as to what I am trying to do - to have the same title in two places: the TITLE tag and the H1 tag, but the part of the title is actually provided by other derived templates.

How does one typically achieve this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

终遇你 2024-08-06 14:26:34

此处所述,定义块会创建一个宏,其名称为块在特殊的“self”对象中:

<title>{% block title %}{% endblock %} - example.com</title>
[...]

<h1> 
  {{ self.title() }} - example.com
</h1>

As documented here, defining a block creates a macro with the name of the block in the special "self" object:

<title>{% block title %}{% endblock %} - example.com</title>
[...]

<h1> 
  {{ self.title() }} - example.com
</h1>
妄想挽回 2024-08-06 14:26:34

这个想法是在宏内创建一个块,然后调用宏两次,而不是让“块”标签重复两次。

在最新的 Jinja2 版本中,此功能有效:

layout.html

{%- extends "base.html" -%}

{%- macro duplicated() -%}
    {% block overrideninchild %}{% endblock %}
{%- endmacro -%}

{% block base_content %}
    {{ duplicated() }}
    {{ duplicated() }}
{% endblock %}

child_page.html

{%- extends "layout.html" -%}

{% block overrideninchild %}
   Should be visible twice.
{% endblock %}

The idea is to create a block inside a macro and then call macro two times, instead of having "block" tag repeated twice.

In latest Jinja2 version this works:

layout.html

{%- extends "base.html" -%}

{%- macro duplicated() -%}
    {% block overrideninchild %}{% endblock %}
{%- endmacro -%}

{% block base_content %}
    {{ duplicated() }}
    {{ duplicated() }}
{% endblock %}

child_page.html

{%- extends "layout.html" -%}

{% block overrideninchild %}
   Should be visible twice.
{% endblock %}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文