gpt4 book ai didi

python - 在 Jinja2 中,如何结合 block 标签使用宏?

转载 作者:太空狗 更新时间:2023-10-29 18:19:43 25 4
gpt4 key购买 nike

我是一名前端开发人员,我一直在努力掌握有效使用 Jinja2 的方法。我想调整当前站点,使其具有多个使用继承的基本模板,它完全使用 block 标记来替换内容并覆盖它,并使用宏来支持参数传递。

我的基本模板包含以下代码(为简单起见进行了编辑):

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
{% from "foo.html" import macro1, macro2, macro3 %}
{% macro base_template(title=none, arg2=none, urls={}, arg3=false) %}
<html>
<title>{{ title }} | Site.com</title>
....
{{ caller() }}
....
</html>
{% endmacro %}

{% block content %}{% endblock %}

我扩展它的页面如下所示:

{% extends "base.html" %}
{% block content %}
{% call base_template(title="home", arg2="active", arg3="true") %}
(html code here)
{% endcall %}
{% endblock %}

所以基本上所有页面都扩展了 base,它们调用一个宏并将参数传递给该宏。我不是很了解这一切,但要点是这允许默认值和一定程度的灵 active ,不需要重新定义整个 block :它提供了一定程度的灵 active 和功能。同样,这被大大简化了。

唯一的问题是,这否定了我使用 block 的能力。宏是为了灵 active ,但是对于 block ,我有能力完全覆盖某些东西,或者使用它的父内容并添加到它,这是我不能用宏做的(至少我不认为)。问题是,我不能用 block 来包装东西,否则他们将看不到宏中的值。例如,这样做:

{% block title %}<title>{{ title }} | Site.com</title>{% endblock %}

会失败,因为它会说 title is undefined。

最终,我正在寻找一种方法来利用 block 的功能和组织方面,但仍然能够利用宏的逻辑性和简洁性。如果有人可以帮助我解决这个问题,我将不胜感激。

最佳答案

block 只能在模板的顶层定义。如果您扩展一个模板,则使用 set 标记在子模板中设置的任何值都可以从它正在扩展的模板中访问。例如,如果您有一个名为 layout.html 的模板:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<title>{{ title }} | Site.com</title>
....
{% block content %}{% endblock content %}
....
</html>

你有这个子模板,index.html:

{% extends "layout.html" %}
{% set title = 'Homepage' %}
{% block content %}
(html code here)
{% endblock content %}

然后父级中对 title 的引用将解析为 'Homepage'。您可以使用任何类型的变量来执行此操作。对于您正在做的事情,我认为不需要宏 - 如果您利用此功能并很好地放置 block ,就布局而言,您将能够完成几乎所有需要做的事情.我会看看 Plurk Solace 使用的一些模板,这是由 Jinja2 的一位作者编写的,如果您想很好地了解何时使用 Jinja2 的各种功能。

关于python - 在 Jinja2 中,如何结合 block 标签使用宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2104957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com