📅  最后修改于: 2023-12-03 14:43:06.544000             🧑  作者: Mango
Jinja2是Python的模板引擎,它提供了强大的模板继承功能,可以用于快速创建具有一致性UI的web应用程序。
继承可以帮助我们减少代码冗余,提高代码复用性。在Jinja2中,我们可以使用{% block %}标签来实现模板继承。
首先我们需要定义一个基本模板,包含应用程序中所有页面共有的HTML,例如导航栏,页脚等。假设我们定义的基本模板名为base.html,示例如下:
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<nav>
{% block nav %}
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Contact</a></li>
</ul>
{% endblock %}
</nav>
<div class="content">
{% block content %}{% endblock %}
</div>
<footer>
{% block footer %}
<p>Copyright ©
{% now 'local', '%Y' %}
</p>
{% endblock %}
</footer>
</body>
</html>
在继承基本模板时,我们需要在子模板中使用{% extends %}标签来指定父模板。示例如下:
{% extends "base.html" %}
{% block title %}Page Title{% endblock %}
{% block content %}
<h1>Hello World!</h1>
<p>Welcome to my website.</p>
{% endblock %}
在此示例中,我们使用{% extends %}标记扩展基本模板。我们使用{% block title %}覆盖了父模板的title块,{% block content %}添加了子模板特有的内容。
Jinja模板引擎支持多层模板继承,即子模板也可以作为另一个模板的父模板。示例如下:
{% extends "blog_base.html" %}
{% block title %}Blog - {{ super() }}{% endblock %}
{% block content %}
<h2>Blog Post</h2>
<h3>Title: {{ post.title }}</h3>
<p>{{ post.content }}</p>
{% endblock %}
在此示例中,我们扩展了blog_base.html,使用{{ super() }}在父级title块中包含了页面标题。
在Jinja继承中,块是一个用于包含特定内容的区域。子模板可以通过{% block %}标签来定义块,并通过{% block %}标签决定是否使用父级块的内容。
如果在子模板中使用了一个{% block %}标记,则Jinja会尝试使用父级模板中的相应块。子模板可以使用super()函数来访问父级块中的内容。
示例代码:
{% block nav %}
{{ super() }}
<li><a href="#">News</a></li>
{% endblock %}
在此示例中,我们扩展了nav块,并使用super()将父级块的内容包含在子级块中。然后,我们添加一个菜单项。
Jinja模板引擎的模板继承功能为我们提供了一种快速创建具有一致性UI的web应用程序的方法。使用继承,我们可以避免代码重复,提高我们的工作效率。