Jinja 中最强大的部分就是模板继承。模板继承允许你构建一个包含你站点共同元素的基 本模板“骨架”,并定义子模板可以覆盖的 块 。

听起来复杂,实际上很简单。从例子上手是最易于理解的。

基本模板

这个模板,我们会把它叫做 base.html ,定义了一个简单的 HTML 骨架文档,你可 能使用一个简单的两栏页面。用内容填充空的块是子模板的工作:

{% block head %}

{% block title %}{% endblock %} - My Webpage

{% endblock %}

{% block content %}{% endblock %}

{% block footer %}

© Copyright 2008 by you.

{% endblock %}

在本例中, {% block %} 标签定义了四个字幕版可以填充的块。所有的 block 标签 告诉模板引擎子模板可以覆盖模板中的这些部分。

子模板

一个子模板看起来是这样:

{% extends "base.html" %}

{% block title %}Index{% endblock %}

{% block head %}

{{ super() }}

.important { color: #336699; }

{% endblock %}

{% block content %}

Index

Welcome on my awesome homepage.

{% endblock %}

{% extend %} 标签是这里的关键。它告诉模板引擎这个模板“继承”另一个模板。 当模板系统对这个模板求值时,首先定位父模板。 extends 标签应该是模板中的第一个 标签。它前面的所有东西都会按照普通情况打印出来,而且可能会导致一些困惑。更多 该行为的细节以及如何利用它,见 Null-Master 退回 。

模板的文件名依赖于模板加载器。例如 FileSystemLoader 允许你用文件名访 问其它模板。你可以使用斜线访问子目录中的模板:

{% extends "layout/default.html" %}

这种行为也可能依赖于应用内嵌的 Jinja 。注意子模板没有定义 footer 块,会 使用父模板中的值。

你不能在同一个模板中定义多个同名的 {% block %} 标签。因为块标签以两种 方向工作,所以存在这种限制。即一个块标签不仅提供一个可以填充的部分,也在父级 定义填充的内容。如果同一个模板中有两个同名的 {% blok %} 标签,父模板 无法获知要使用哪一个块的内容。

如果你想要多次打印一个块,无论如何你可以使用特殊的 self 变量并调用与块同名 的函数:

{% block title %}{% endblock %}

{{ self.title() }}

{% block body %}{% endblock %}

Super 块

可以调用 super 来渲染父级块的内容。这会返回父级块的结果:

{% block sidebar %}

Table Of Contents

...

{{ super() }}

{% endblock %}

命名块结束标签

Jinja2 允许你在块的结束标签中加入的名称来改善可读性:

{% block sidebar %}

{% block inner_sidebar %}

...

{% endblock inner_sidebar %}

{% endblock sidebar %}

无论如何, endblock 后面的名称一定与块名匹配。

嵌套块和作用域

嵌套块可以胜任更复杂的布局。而默认的块不允许访问块外作用域中的变量:

{% for item in seq %}

{% block loop_item %}{{ item }}{% endblock %}

{% endfor %}

这个例子会输出空的  项,因为 item 在块中是不可用的。其原因是,如果 块被子模板替换,变量在其块中可能是未定义的或未被传递到上下文。

从 Jinja 2.2 开始,你可以显式地指定在块中可用的变量,只需在块声明中添加 scoped 修饰,就把块设定到作用域中:

{% for item in seq %}

{% block loop_item scoped %}{{ item }}{% endblock %}

{% endfor %}

当覆盖一个块时,不需要提供 scoped 修饰。

模板对象

Changed in version 2.4.

当一个模板对象被传递到模板上下文,你也可以从那个对象继承。假设调用 代码传递layout_template 布局模板到环境,这段代码会工作:

{% extends layout_template %}

之前 layout_template 变量一定是布局模板文件名的字符串才能工作。

html模板继承,模板继承相关推荐

  1. C++知识点61——typename与class、模板编程与继承、模板类和友元、类模板与static成员

    一.typename与class的异同 1.啥时候既可以使用typename,又可以使用class? 当表示模板参数的时候,二者没有区别 2.啥时候只能使用typename,不能使用class? 当模 ...

  2. 类模板,多种类型的类模板,自定义类模板,类模板的默认类型,数组的模板实现,友元和类模板,友元函数,类模板与静态变量,类模板与普通类之间互相继承,类模板作为模板参数,类嵌套,类模板嵌套,类包装器

     1.第一个最简单的类模板案例 #include "mainwindow.h" #include <QApplication> #include <QPush ...

  3. flask mysql项目模板渲染_21. Flask 模板 - 宏、继承、包含

    宏的概念 类似于python中的函数,宏的作用就是在模板中重复利用代码,避免代码冗余. Jinja2支持宏,还可以导入宏,需要在多处重复使用的模板代码片段可以写入单独的文件,再包含在所有模板中,以避免 ...

  4. Jinja2模板与模板继承

    Jinja2 两个概念: Jinja2:是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,其 ...

  5. go html template 数据怎么加减乘除_Go 视图模板篇(五):模板布局和继承

    模板布局与继承 在 Go 模板中,可以结合 define 指令和 template 指令实现模板布局功能. 首先编写一段服务端示例代码: package main import ( "htm ...

  6. 笔记②:牛客校招冲刺集训营---C++工程师(面向对象(友元、运算符重载、继承、多态) -- 内存管理 -- 名称空间、模板(类模板/函数模板) -- STL)

    0618 C++工程师 第5章 高频考点与真题精讲 5.1 指针 & 5.2 函数 5.3 面向对象(和5.4.5.5共三次直播课) 5.3.1 - 5.3.11 5.3.12-14 友元 友 ...

  7. 2021-07-31-DJ-009 Django模板页面的继承与定制,一个Base.html,仿制漂亮的效果

    文章目录 一.导入Bootstrap和JQuery库 二.做一个Base页面 三.通过基础页面基础上渲染自己的页面 一.导入Bootstrap和JQuery库 静态文件的配置在上一篇已经讲过了,这里从 ...

  8. 【C++模板编程入门】模板介绍、模板定义、函数模板、类模板、模板的继承

    1.模块的引入 1.1.示例代码 #include <iostream> #include <string>using namespace std;//用template声明T ...

  9. 【c++】模板类继承模板类

    C++继承访问权限:https://www.runoob.com/cplusplus/cpp-inheritance.html 1. 普通类继承 demo #include <iostream& ...

  10. [C++]模板类的继承

    1.  模块基类不用指定传参类型 // 定义模板类,作为父类 template <typename T> class People { public:T x;People(){};Peop ...

最新文章

  1. winform下通过webclient使用非流方式上传(post)数据和文件
  2. 学会数据库读写分离、分表分库
  3. Windows线程调度学习(一)
  4. php 动态加载html内容_ThinkPHP5.1+Swoole实现的开源内容管理框架
  5. 【英语学习】【医学】无机化学 - 化合物命名(2) - 非金属类二元化合物
  6. 4位格雷码的顺序编码_八位格雷码转换器.doc
  7. html5的service worker,GitHub - w3c/ServiceWorker: Service Workers
  8. WinFrom 中 label背景透明
  9. 佳能 6D Mark II与 90D 对比评测
  10. 《财富自由子路》李笑来
  11. 论文发表都有哪些期刊
  12. excel批量添加超级链接
  13. turbo编译加强java_给你无限可能,创造更多价值! TurboShop V3.5 版本发布
  14. 成为一名Java后端工程师需要掌握的技能
  15. HTML之变色(蓝、绿、红)
  16. 初创企业购买企业邮箱_停止对初创企业的限制
  17. P1567 统计天数(洛谷)
  18. AI推理服务平台升级,阿里云机器学习PAI推出新规格
  19. SK6805MICRO-2427RGB灯珠 2427RGB内置IC灯珠 适用显示领域、智能应用、蓝牙WiFi装饰
  20. mxnet Record IO详解

热门文章

  1. Tomcat调优主要内容如下
  2. echarts出现异常竖线的解决办法
  3. node.js医保药品集中采购平台-采购系统的设计与实现271542
  4. Python到底能做什么?
  5. 信息系统管理工程师好考吗?如何去备考呢?
  6. 10步教你画漫画人物
  7. 【转】[译] zram.txt
  8. 上门女婿 黄河九十九道湾
  9. 不要再做买衣服的冤大头,杰克琼斯、真维斯、班尼路怎么买
  10. 【知识图谱学习】知识图谱搭建医疗问答系统