jinja2对block模板的理解

模板继承包含基本模板和子模板。其中基本模板里包含了你这个网站里的基本元素的基本骨架,但是里面有一些空的或者是不完善的块(block)需要用子模板来填充。

如基本模板base.html为:

<!doctype html public "-//w3c//dtd html 4.01//en">
<html lang="en">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    {% block head %}
    <link rel="stylesheet" href="style.css" />
    <title>{% block title %}{% endblock %} - my webpage</title>
    {% endblock %}
</head>
<body>
    <div id="content">{% block content %}{% endblock %}</div>
    <div id="footer">
        {% block footer %}
            &copy; copyright 2008 by <a href="http://domain.invalid/">you</a>.
        {% endblock %}
    </div>
</body>
  • 其中用黑色粗体标出了许多块,head,title,content和footer块为空块需要子模板填充;
  • head和footer本身有内容,可以填充也可以继承。head继承:- my webpage,footer继承&copy; copyright 2008 by <a href="http://domain.invalid/">you</a>.

子模板如下:

{% extends "base.html" %}
{% block title %}index{% endblock %}
{% block head %}
    {{ super() }}
    <style type="text/css">
        .important { color: #336699; }
    </style>
{% endblock %}
{% block content %}
    <h1>index</h1>
    <p class="important">
      welcome on my awesome homepage.
    </p>
{% endblock %}
  • 成功运行后将把子模板中定义的各个子块填充到基本模板后输出。
  • 特别注意的是{{super()}}的意思是不仅用子模板中的内容填充,也要调用基本模板中的部分内容。
  • 该子模板并未定义footer块的内容,因此在输出的结果中footer块将保留基本模板中的内容。

注意:

  • {% extends "base.html" %}:模板将继承base.html
  • {{ super() }}:在子模板中重写父模板的block中打印被重写的block的内容,本例中,重写了.important的ccs样式
时间: 2024-10-12 22:14:53

jinja2对block模板的理解的相关文章

Ansible用于网络设备管理 part 2 对Jinja2 YAML 和 module的理解

虽然很不想用“应该”这个词,但是还是写上了,的确我自己目前就是这么理解的. 那么这个理解就是,Ansible的一个key point 就是总的一个playbook是去依赖很多元素的,就像一开始那个图里画的,如下图 这里面就涉及到它下挂的不管是yml文件还是Jinja2文件,这些文件的内部一定是和Ansible这个东西相紧密关联的,我之前之所以不那么理解就是在于这一点没有弄清楚,再说明白一点就是下面的内容 看到task:下面的东西了么?name, yum, service,还有在Jinja2文件(

关于block的一些理解

之前一直都是用这别人或者是系统系统封装好的block,用这都挺好,可以访问那些定义了block变量的函数变量在block中使用. 首先总结一个block的用法:1.block有些类似于函数的指针 拥有返回值,参数名称 .例:void (^useBlock)(int a, int b){}; 2.可以用typedef来定义block: typedef void(^MyBlock)(int a,int b); 使用 block的时候用法是:MyBlock block = ^(int a,int b)

iOS block的一些理解

Block实体形式如下:^(传入参数列){行为主体}; Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal.行为主体可以用return回传值,类型会被compiler自动辨别.如果没有参数列要写成: ^(void). ps:一个block虽然和函数指针有些相似,但是实际上代表一个底层数据结构,类似与对象,有编译器去创建和管理.block的一个优势是可以使用其自己作用域外的变量,

后缀数组模板(理解)

字符串的处理真可谓是博大精深,后缀数组这种数据结构我花了两天时间才明白了其构造的过程.主要是代码不好理解. 数据结构: 1.sa数组,就是后缀数组,按照字典序排列,其意义为:sa[i]=k,排第i名的子串是从k位开始的. 2.rank名次数组,其意义为:rank[i]=k,以i为起点的子串排名为k. 很容易看出来两者可以相互转化. 求这两个数组的过程是基于基数排序,计数排序的方法. 下面是一个大牛的注释版.其中我在补充点: 1.对于求y[]这个数组,因为已经知道上次长为j的子串比较结果,那么这次

对于Block的一些理解与认识

// // ViewController.m // BlockTest // // Created by CoderHJChao on 8/13/15. // Copyright (c) 2015 CoderHJChao. All rights reserved. // #import "ViewController.h" @interface ViewController () { NSString *_name; // 名字 } @end @implementation ViewC

BFC(Block Formatting Context)理解

BFC:即块级格式上下文:在创建BFC的情况下,则所属的作用环境就变成了一个独立的布局环境. 在BFC中,盒子从顶端开始垂直地一个接一个地排列,两个盒子之间的垂直的间隙是由他们的margin 值所决定的. 在一个BFC中,两个相邻的块级盒子的垂直外边距会产生折叠. 在BFC中,每一个盒子的左外边缘(margin-left)会触碰到容器的左边缘(border-left) (对于从右到左的格式来说,则触碰到右边缘). 如何创建BFC 当一个HTML元素满足下面条件的任何一点,都可以产生Block F

kmp算法模板及理解

kmp算法是复杂度为O(n+m)的字符串匹配算法; 首先kmp算法的核心是在模式串中获得next数组,这个数组表示模式串的子串的前缀和后缀相同的最长长度; 这样在匹配的过程中如果指到不匹配的位置,模式串用next数组进行跳转到符合的位置,而目标串不需要再往回匹配,为什么是最长的相同的前缀后后缀呢? 因为只有这样才能一边避免可能漏掉的位置,一边尽量不重复已经匹配的位置; getNext的函数: void getNext() { int k = -1,j = 0,len = strlen(str);

appium+python自动化50-生成定位对象模板templet(jinja2)

前言 每次自己写pageobject定位元素对象太繁琐,格式都差不多,只是换个定位方法,这种就可以才有模板的方式,批量生成pageobject定位元素对象的模板 python里面生成模板有两个模块可以选择:templet和mako 简单来说,本篇实现的目的是用代码去自动生成代码,做到代码自动化 接着上一篇讲:appium+python自动化49-yaml管理定位元素 jinja2简介 1.jinja2官方文档:官方文档 要了解jinja2,那么需要先理解模板的概念.模板在Python的web开发

第57课 深入理解函数模板

1. 函数模板深入理解 (1)编译器从函数模板通过具体类型产生不同的函数 (2)编译器会对函数模板进行两次编译 ①对模板代码本身进行编译 ②对参数替换后的代码进行编译(编译时机:可能发生在定义对象或函数调用时) (3)注意事项 ①函数模板本身不允许隐式类型转换 ②自动推导类型时,必须严格匹配 ③显式类型指定时,能够进行隐式类型转换 [编程实验]函数模板的本质 #include <iostream> #include <string> using namespace std; cla