3.5 宏、继承、包含

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

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

定义宏

{% macro input() %}
<input type="text"
name="username"
value=""
size=""/>
{% endmacro %}

调用宏

{{ input() }}

定义带参数的宏

{% macro input(name,value='',type='text',size=20) %}
<input type="{{ type }}"
name="{{ name }}"
value="{{ value }}"
size="{{ size }}"/>
{% endmacro %}

调用宏,并传递参数

{{ input(value='name',type='password',size=40)}}

把宏单独抽取出来,封装成html文件,其它模板中导入使用

文件名可以自定义macro.html

{% macro function() %}

    <input type="text" name="username" placeholde="Username">
<input type="password" name="password" placeholde="Password">
<input type="submit">
{% endmacro %}

在其它模板文件中先导入,再调用

{% import 'macro.html' as func %}
{% func.function() %}

模板继承:

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

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

子模板使用extends指令声明这个模板继承自哪?父模板中定义的块在子模板中被重新定义,在子模板中调用父模板的内容可以使用super()。

父模板:base.html

  {% block top %}
顶部菜单
{% endblock top %} {% block content %}
{% endblock content %} {% block bottom %}
底部
{% endblock bottom %}

子模板:

  {% extends 'base.html' %}
{% block content %}
需要填充的内容
{% endblock content %}
  • 模板继承使用时注意点:

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

包含(Include)

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

示例:

include的使用

{\% include 'hello.html' %}

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

示例:

include的使用加上关键字ignore missing

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

  • 宏、继承、包含:

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

最新文章

  1. C#读取Excel表格数据到DataGridView中和导出DataGridView中的数据到Excel
  2. Orcle基本语句(六)
  3. &lt;Oracle Database&gt;诊断文件
  4. vim文本编辑器
  5. MongoDB与Mysql常用命令解释
  6. Windows出现BOOT\BCD错误的解决办法
  7. 美行Thinkpad八通道快捷入口
  8. ajax — get? or post?
  9. C# 反射 设置字段值无效的解决办法
  10. JS中undefined与null的区别
  11. 一个简单的redis调用类
  12. ps&amp;&amp;/proc/pid/xxx
  13. HTML5 进阶系列:拖放 API 实现拖放排序(转载)
  14. [iOS11] contentInsetAdjustmentBehavior 问题, push back时, 界面会上下移动.
  15. 微信小程序原生开发简介
  16. hdu 4027 Can you answer these queries?[线段树]
  17. Sql语句常用关键字
  18. vim 中文乱码问题
  19. JS关于浏览器尺寸的方法
  20. 关于在eclipse下的mapreduce工程打包成jar包的问题(包含第三方jar包)

热门文章

  1. 【剑指offer】输入一颗二叉树的根节点,判断是不是平衡二叉树,C++实现
  2. c# mysql and sqlserver数据库连接字符串
  3. Windows批处理笔记
  4. IIS反向代理/Rewrite/https卸载配置
  5. hiho1613 墨水滴
  6. APP开发浅谈-Fiddler抓包详解
  7. 【angularJS】Filter 过滤器
  8. 异步加载JS几种方式
  9. 【java基础】Java的retry标记的使用
  10. ballerina 学习十六 错误&amp;&amp;异常处理