我是一名前端开发人员,我一直在努力有效地使用 Jinja2。我想调整当前站点,使其具有多个使用继承的基本模板,它完全使用块标签来替换内容并覆盖它,并使用宏来支持参数传递。
我的基本模板包含以下代码(为简单起见进行了编辑):
<!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 %}
所以基本上所有的页面都扩展了基础,它们调用一个宏并将参数传递给该宏。我不太了解这一切,但要点是这允许使用默认值和一定程度的灵活性,而不需要重新定义整个块:它提供了一定程度的灵活性和功能。这又被大大简化了。
唯一的问题是,这否定了我使用积木的能力。宏是为了灵活性,但是对于块,我有能力完全覆盖某些东西,或者使用它的父内容并添加到它,这是我不能用宏做的(至少我不这么认为)。问题是,我不能将东西包装在块中,否则他们将看不到宏中的值。例如,这样做:
{% block title %}<title>{{ title }} | Site.com</title>{% endblock %}
将失败,因为它会说标题未定义。
最终,我正在寻找一种方法来利用块的功能和组织方面,但仍然能够利用宏的逻辑和简洁性。如果有人可以就如何解决这个问题给我任何帮助,我将不胜感激。