📜  jinja 继承 - Python (1)

📅  最后修改于: 2023-12-03 14:43:06.544000             🧑  作者: Mango

Jinja 继承 - Python

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应用程序的方法。使用继承,我们可以避免代码重复,提高我们的工作效率。