JinJa2模版重用

52 阅读2分钟

JinJa2模版重用

模版宏

宏类似于Python中的函数,宏的作用就是在模板中重复利用代码,避免代码冗余

Jinja2支持宏,还可以导入宏,需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免重复


  • {% macro %}: 定义个宏
{% macro macro_test(href) %}
	<h3>这是个宏</h3>
	<a href="{{ href }}">这是链接</a>
{% endmacro %}
  • 使用宏
{{ macro_test("https://baidu.com") }}

宏一般会定义为一个html文件,在其他模版中可以导入使用

  • 定义一个测试宏文件macro_input.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{% macro user_form(username,password) %}
    <input type="text" name="username" value="{{ username }}">
    <input type="password" name="password" value="{{ password }}">
    <input type="submit" value="submit">
{% endmacro %}
</body>
</html>
  • 使用这个宏文件
{% import 'macro_input.html' as macro_input %}
{{ macro_input.user_form("admin","123456") }}

模版继承

模板继承是为了重用模板中的公共内容

一般Web开发中,继承主要使用在网站的顶部菜单、底部。这些内容可以定义在父模板中,子模板直接继承,而不需要重复书写


{% block %}标签定义的内容,相当于在父模板中挖个坑,当子模板继承父模板时,可以进行填充

  • 父模版
{% block top %}
	顶部菜单 导入一系列css样式等
{% endblock top %}

{% block content %}
	内容
{% endblock content %}

{% block bottom %}
	底部 导入一系列js等
{% endblock bottom %}
  • 子模版,使用{% extends %}标签引入父模版
{% extends 'base.html' %}
{% block content %}
	需要填充的内容
{% endblock content %}

  • 注意
    • 不支持多继承
    • 为了便于阅读,在子模板中使用extends时,尽量写在模板的第一行
    • 不能在一个模板文件中定义多个相同名字的block标签
    • 当在页面中使用多个block标签时,建议给结束标签起个名字,当多个block嵌套时,阅读性更好

模版包含

Jinja2模板中,除了宏和继承,还支持一种代码重用的功能,叫包含{% include %}

它的功能是将另一个模板整个加载到当前模板中,并直接渲染


包含在使用时,如果包含的模板文件不存在时,程序会抛出TemplateNotFound异常,可以加上ignore missing关键字

如果包含的模板文件不存在,会忽略这条include语句

{% include 'index.html' ignore missing %}

宏(Macro)、继承(Block)、包含(include)均能实现代码的复用。

继承(Block)的本质是代码替换,一般用来实现多个页面中重复不变的区域。

宏(Macro)的功能类似函数,可以传入参数,需要定义、调用。

包含(include)是直接将目标模板文件整个渲染出来。