前言

前面学习了jijia2模板语言的一些基础知识,接下来继续深挖jijia2语言的用法。

系列文章

控制语句

和python语言一样,模板语言也有自己的控制语句,比如条件语句、循环语句等等;

条件语句if

{% if name and name == 'admin'  %}
<h1>This is admin console</h1>
{% elif name %}
<h1>Welcome {{ name }}!</h1>
{% else %}
<h1>Please login</h1>
{% endif %}

循环语句for

# 基本的for循环结构
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %}
# 当for循环没有执行时使用else中代替
{% for user in users %}
<li>{{ user.username|e }}</li>
{% else %}
<li><em>no users found</em></li>
{% endfor %} # 去除空白,加-,注意%和-必须紧靠,否则无效;
{% for digit in digits -%}
{{ digit }}
{%- endfor %}

注意:访问每次循环中的数据使用loop变量代表本次的循环

{% for user in users %}
<li>{{ user.username|e }}</li>
{% if loop.index == 2 %}
<p>OK</p>
{% endif %}
{% endfor %} loop.index 当前循环迭代的计数(从 1 开始)
loop.index0 当前循环迭代的次数(从 0 开始)
loop.revindex 到循环结束需要迭代的次数(从 1 开始)
loop.revindex0 到循环结束需要迭代的次数(从 0 开始)
loop.first 如果是第一次迭代,为 True 。
loop.last 如果是最后一次迭代,为 True 。
loop.length 序列中的元素的个数,即循环的长度;
loop.cycle 在一串序列间期取值的辅助函数。
loop.depth 当前循环在递归中的层级(从1开始)
loop.depth0 当前循环在递归中的层级(从0开始)

作用域控制with

# 限制对象的作用域,foo作为局部变量
{% with foo = 1 %}
{% set bar = 2 %}
{{ foo + bar }}
{% endwith %} # do可以将表达式转换语句,即表示执行的意思
{% with arr = ['Sunny'] %}
{% do arr.append('Rainy') %} # 执行arr.append('Rainy')语句
{{ arr }}
{% endwith %}

表达式

  • 算术表达式
# 其语法和python中的一模一样
{{ a + b}}
  • 比较表达式
# 其语法和python中的一模一样
{{ a == b}}
  • ~
{{ "Hello " ~ name ~ "!" }}
返回(假设 name 值为 'John' ) Hello John!

转义

  • raw忽略模板的语法
# {{}} 和{%%}这种形式将失效,代表它们本身的符号
{% raw %}
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% endraw %}
  • 自动转义
# autoescape参数,如果为false则关闭转义,flask框架中默认为True
{% autoescape false %}
<h1>Hello {{ name }}!</h1>
{% endautoescape %}

模板继承

# test.html
# 父模板
{% block head %} {% endblock %} # 子模板
{% extends "test.html" %}
{% block head %}
{{ super() }}
Index
{% endblock %}
  • 想要渲染父模板中的模板需要使用{{ super() }},即如果父块中已经有语句,不是空的,如果要保留就需要使用这个

注意:继承之后,块内是无法访问块外的变量的,如果想要访问,则:

# scoped参数可以让list块内访问块外的变量
{% block list scoped %}{% endblock %}

包含include

include可以加载另一个模板在当前的位置,直接渲染;

# 直接在当前的位置
<body>
{% include 'footer.html' %}
</body>
# 当”include”的模板文件不存在时,程序会抛出异常。可以加上”ignore missing”关键字,这样如果模板不存在,就会忽略这段”{% include %}”语句。
{% include 'footer.html' ignore missing %}
# 添加多个模板
{% include ['footer.html','bottom.html','end.html'] ignore missing %}

  • 宏简单来说就是在模板中定义并使用的函数,用来简化代码量

  • 定义一个宏

# 使用macro定义,相当于def
{% macro input(name, type='text', value='') -%}
<input type="{{ type }}" name="{{ name }}" value="{{ value }}"> {%- endmacro %}
  • 调用一个宏
# 通过表达式调用
<p>{{ input('username', value='user') }}</p>
<p>{{ input('password', 'password') }}</p> # 使用call,会将里面的内容替换func函数中的caller()方法
{% call func(users) %}
<td><input name="delete" type="button" value="Delete"></td>
{% endcall %}
# 调用宏的参数,func函数中的caller(name)方法的参数name可以传递过来
{% call(name) func(users) %}
<td><input name="delete" type="button" value="Delete"></td>
{% endcall %}

宏里面自动添加了varargs和kwargs参数,可以用来接收多余的变量或键值对参数;

  • 宏的导入:

一个宏可以被不同的模板使用,建议将其声明在一个单独的模板文件中。需要使用时导入进来即可,而导入的方法也非常类似于Python中的”import”。

{% import 'form.html' as form %}
<p>{{ form.input('username', value='user') }}</p>

参考:

flask基础之jijia2模板语言进阶(三)的更多相关文章

  1. flask基础之jijia2模板使用基础(二)

    前言 在以前前后端不分离的时代,后台程序员往往又当爹又当妈,需要将前端程序员写的h5页面填充模板语言.而jijia2是一门十分强大的python的模板语言,是flask框架的核心模块之一.先简单介绍一 ...

  2. 第二百五十九节,Tornado框架-模板语言的三种方式

    Tornado框架-模板语言的三种方式 模板语言就是可以在html页面,接收逻辑处理的self.render()方法传输的变量,将数据渲染到对应的地方 一.接收值渲染 {{...}}接收self.re ...

  3. flask 第四篇 模板语言jinja2

    是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...

  4. 测开之路三十:Flask基础之jinja2模板继承

    实现某些位置的内容固定,某些位置的内容动态展示,如: 中文文档地址:http://docs.jinkan.org/docs/jinja2/templates.html#template-inherit ...

  5. Django模板语言进阶

    一.母板 1.什么情况下使用母版 当多个页面的大部分内容都一样的时候,我们可以把相同的部分提取出来,放到一个单独的母版HTML文件中 然后在母版中定义需要被替换的block 例如:母板页面 <! ...

  6. 测开之路二十九:Flask基础之jinja2模板

    中文文档:http://docs.jinkan.org/docs/jinja2/ 与静态资源一样,Flask默认的模板目录名为templates,如果有需要的话和static一样,要在初始化的时候声明 ...

  7. flask基础之AppContext应用上下文和RequestContext请求上下文(六)

    前言 应用上下文和请求上下文存在的目的,官方文档讲的很清楚,可参考: http://www.pythondoc.com/flask/appcontext.html 应用上下文对象在没有请求的时候是可以 ...

  8. flask基础之请求处理核心机制(五)

    前言 总结一下flask框架的请求处理流程. 系列文章 flask基础之安装和使用入门(一) flask基础之jijia2模板使用基础(二) flask基础之jijia2模板语言进阶(三) flask ...

  9. flask基础之app初始化(四)

    前言 flask的核心对象是Flask,它定义了flask框架对于http请求的整个处理逻辑.随着服务器被启动,app被创建并初始化,那么具体的过程是这样的呢? 系列文章 flask基础之安装和使用入 ...

随机推荐

  1. SQL的拼接语句在DELPHI中怎么写

    SQL 语句的拼接,关键点在于对引号的处理上. 在 delphi 的语法中,使用单引号做字符串的标志符.因此,当遇到 SQL 语句中字符串标识量编写的时候,需要用两个单引号来代替实际的引号. 举例: ...

  2. BZOJ3613 HEOI2014南园满地堆轻絮

    不明白在某谷上是怎么标到紫的.二分答案或者发现答案就是最大逆序差的一半. #include<iostream> #include<cstdio> #include<cma ...

  3. Golang的第一个程序-Hello, World !

    安装Golang: 1. 下载安装包 https://golang.google.cn/dl/ 我这里使用压缩包,下载后解压到D盘(自定义). 2. 添加环境变量:把解压后的bin目录添加到环境变量中 ...

  4. [BZOJ4870][Shoi2017]组合数问题 dp+矩阵乘

    4870: [Shoi2017]组合数问题 Time Limit: 10 Sec  Memory Limit: 512 MB Description Input 第一行有四个整数 n, p, k, r ...

  5. Unity3D手游开发日记(5) - 适合移动平台的植被随风摆动

    一直在思考怎么让场景更有生机,我觉得植被的随风摆动是必不可少的.CE3引擎的植被bending就做得特别棒.我也准备在手机上做一套. 先分析一下植被摆动常见的几种做法.其实不管哪种做法,核心就是让植被 ...

  6. RHEL 7中有关终端的快捷方式

    快速启动终端 网上有不错的教程,只是有时候和版本有一定的出入,这里涉及小白博主自行摸索的过程(RHEL 7.4). 1.点击桌面右上角,选择设置(小扳手) 2.选择键盘(Keyboard) 3.将进度 ...

  7. ASCLL表

    ASCII码表完整版 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 ASCII值 控制字符 0 NUT 32 (space) 64 @ 96 . 1 SOH 33 ! 65 ...

  8. HDU 3480 斜率dp

    Division Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 999999/400000 K (Java/Others)Total ...

  9. tomcat8 的 websocket 支持

    使用 tomcat8 开发 WebSocket 服务端非常简单,大致有如下两种方式. 1.使用注解方式开发,被 @ServerEndpoint 修饰的 Java 类即可作为 WebSocket 服务端 ...

  10. 把一个文件中所有文件名或者文件路径读取到一个txt文件,然后在matlab中读取

    链接: http://blog.csdn.net/dreamgchuan/article/details/51113295 dir /on/b/s  这个读取的是这样的格式: