Python 在Jinja2中,如何将宏与块标记结合使用?

Python 在Jinja2中,如何将宏与块标记结合使用?,python,django,templates,django-templates,jinja2,Python,Django,Templates,Django Templates,Jinja2,我是一名前端开发人员,我一直在尝试有效地使用Jinja2。我想调整当前站点,使其具有多个使用继承的基本模板,它完全使用块标记替换内容并覆盖内容,并使用宏支持参数传递 我的基本模板包含以下代码(为简单起见进行了编辑): 所以基本上所有的页面都扩展了base,它们调用一个宏并向该宏传递参数。我并不完全理解,但主要的一点是,这允许默认值和一定程度的灵活性,而不需要重新定义整个块:它提供了一定程度的灵活性和功能。同样,这是非常简化的 唯一的问题是,这否定了我使用积木的能力。宏是为了灵活性,但对于块,我有

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

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

所以基本上所有的页面都扩展了base,它们调用一个宏并向该宏传递参数。我并不完全理解,但主要的一点是,这允许默认值和一定程度的灵活性,而不需要重新定义整个块:它提供了一定程度的灵活性和功能。同样,这是非常简化的

唯一的问题是,这否定了我使用积木的能力。宏是为了灵活性,但对于块,我有能力完全重写某些内容,或者使用它的父内容并添加到其中,这是宏所不能做到的(至少我不这么认为)。问题是,我不能把东西包装成块,否则它们就看不到宏中的值。例如,这样做:

{% block title %}<title>{{ title }} | Site.com</title>{% endblock %}
{%block title%}{{title}}Site.com{%endblock%}
将失败,因为它会说标题未定义


最终,我在寻找一种既能利用块的力量又能利用块的组织方面的方法,但仍然能够利用宏的逻辑和简洁性。如果有人能帮我解决这个问题,我将不胜感激。

块只能在模板的顶层定义。如果扩展模板,则使用
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>
{% extends "layout.html" %}
{% set title = 'Homepage' %}
{% block content %}
(html code here)
{% endblock content %}

然后父级中对
标题的引用将解析为
“主页”
。您可以使用任何类型的变量执行此操作。对于你正在做的事情,我不认为有任何需要宏-如果你利用这个功能,并放置块好,你将能够做几乎所有你需要做的布局方面的事情。如果你想知道什么时候使用Jinja2的各种功能,我会看看其中一位Jinja2作者所使用的一些模板。

我现在就要尝试一下,不过不管它是否工作正常,谢谢你的帮助,非常感谢。我也会看看你提供的bitbucket链接。哇,你完全不知道这对我有多大帮助。我现在可以使用块作为主覆盖,但我在整个基础中设置了变量,我可以设置一个字典来覆盖其中任何一个,这正是我想要的。谢谢你的帮助!
<!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>
{% extends "layout.html" %}
{% set title = 'Homepage' %}
{% block content %}
(html code here)
{% endblock content %}