flask框架------JinJa2模板代码复用(宏、继承、包含)

博客介绍了在模板中使用 JinJa2 实现代码复用的方法。当多个模板存在相同内容时,可利用宏、继承、包含来解决。宏类似函数可避免代码冗余;继承用于重用公共内容,如网站顶部菜单和底部;包含则是将另一个模板加载到当前模板并渲染。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板代码复用

在模板中,可能会遇到以下情况:

1.多个模板具有完全相同的顶部和底部内容
2.多个模板中具有相同的模板代码内容,但是内容中部分值不一样
3.多个模板中具有完全相同的 html 代码块内容

像遇到这种情况,可以使用 JinJa2 模板中的 宏、继承、包含来进行实现

1.宏

对宏(macro)的理解:

(1)把它看作 Jinja2 中的一个函数,它会返回一个模板或者 HTML 字符串
(2)为了避免反复地编写同样的模板代码,出现代码冗余,可以把他们写成函数以进行重用
(3)需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免重复

1.1 代码演练

使用宏之前的代码

<form>
    <label>用户名:</label><input type="text" name="username"><br/>
    <label>身份证号:</label><input type="text" name="idcard"><br/>
    <label>密码:</label><input type="password" name="password"><br/>
    <label>确认密码:</label><input type="password" name="password2"><br/>
    <input type="submit" value="注册">
</form>

定义宏

{#定义宏,相当于定义一个函数,在使用的时候直接调用该宏,传入不同的参数就可以了#}
{#以下相当于定义了一个名为input的函数,括号内为参数#}
{#末尾需要加结束符endmacro#}
{% macro input(label="",type="text",name="",value="") %}
 <label>{{label}}</label><input type="{{type}}" name="{{name}}" value="{{value}}"><br/>
 {% endmacro %}

使用宏

<form>
    {{ input(label="用户名:", name="username") }}<br/>
    {{ input(label="身份证号:", name="idcard") }}<br/>
    {{ input(label="密码:", type="password",name="password") }}<br/>
    {{ input(label="确认密码:", type="password",name="password2") }}<br/>
    {{ input( type="submit",value="注册"}}
</form>

2.继承

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

1.相当于在父模板中挖个坑,当子模板继承父模板时,可以进行填充。
2.子模板使用 extends 指令声明这个模板继承自哪个模板
3.父模板中定义的块在子模板中被重新定义,在子模板中调用父模板的内容可以使用super()

父模板

base.html
例如:网站的顶部菜单、底部在各个页面都相同,就可以提取出来。

{% block topBlock %}
  顶部菜单,此处可以提取固定html标签
{% endblock topBlock %}

{% block contentBlock %}
此处为挖的坑,子模板可以按需修改
{% endblock contentBlock %}

{% block bottomBlock %}
  底部,此处可以提取固定html标签
{% endblock bottomBlock %}

子模板

extends指令声明这个模板继承自哪

{% extends 'base.html' %}
{% block contentBlock %}
 需要填充的内容
{% endblock contentBlock %}

模板继承使用时注意点:

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

3.包含

Jinja2模板中,除了宏和继承,还支持一种代码重用的功能,叫包含(Include)。它的功能是将另一个模板整个加载到当前模板中,并直接渲染。

include的使用

{% include 'hello.html' %}

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

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

小结

  1. 宏(Macro)、继承(Block)、包含(include)均能实现代码的复用。
  2. 继承(Block)的本质是代码替换,一般用来实现多个页面中重复不变的区域。
  3. 宏(Macro)的功能类似函数,可以传入参数,需要定义、调用
  4. 包含(include)是直接将目标模板文件整个渲染出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值