前言:django的模板语法基本和flask的jinja2基本一样。下面比较一下两个模板语法的区别。
------深度变量的查找(万能的句点号)
在 Django 模板中遍历复杂数据结构的关键是句点字符 (.)。
1.模板变量
django:{{ 变量 }} # 因为django只有一个context返回,全部数据都集中在一起
jinja2:{{ 对象.变量 }}
2.根据列表的下标获取值
django:{{ 列表.0 }}
jinja2:{{ 列表[0] }}
3.根据字典的键获取字典的值
django:{{ 字典.key }}
jinja2:{{ 字典[key] }}或者{{ 字典.key }}
4.for循环时取序号
django:
{% for item in 列表 %} {{forloop.counter}} <1-- 表示当前是第几次循环,从1开始 --> {{forloop.counter0}} <!-- 表示当前是第几次循环,从0开始 -->{% endfor %}
jinja2:
{% for item in 列表 %} {{loop.index}} <1-- 表示当前是第几次循环,从1开始 --> {{loop.index0}} <!-- 表示当前是第几次循环,从0开始 -->{% endfor %}
# for遍历字典
{{ for key,val in dic.items}}
{{k}} : {{v}}
{{ endfor }}
<ul>
{% for obj in list %} <li>{{ obj.name }}</li> {% endfor %} </ul> #在标签里添加reversed来反序循环列表: {% for obj in list reversed %} ... {% endfor %} #{% for %}标签可以嵌套: {% for country in countries %} <h1>{{ country.name }}</h1> <ul> {% for city in country.city_list %} <li>{{ city }}</li> {% endfor %} </ul> {% endfor %} #系统不支持中断循环,系统也不支持continue语句,{% for %}标签内置了一个forloop模板变量, #这个变量含有一些属性可以提供给你一些关于循环的信息 1,forloop.counter表示循环的次数,它从1开始计数,第一次循环设为1: {% for item in todo_list %} <p>{{ forloop.counter }}: {{ item }}</p> {% endfor %} 2,forloop.counter0 类似于forloop.counter,但它是从0开始计数,第一次循环设为0 3,forloop.revcounter 4,forloop.revcounter0 5,forloop.first当第一次循环时值为True,在特别情况下很有用: {% for object in objects %} {% if forloop.first %}<li class="first">{% else %}<li>{% endif %} {{ object }} </li> {% endfor %} # 富有魔力的forloop变量只能在循环中得到,当模板解析器到达{% endfor %}时forloop就消失了 # 如果你的模板context已经包含一个叫forloop的变量,Django会用{% for %}标签替代它 # Django会在for标签的块中覆盖你定义的forloop变量的值 # 在其他非循环的地方,你的forloop变量仍然可用 #{% empty %} {{li }} {% for i in li %} <li>{{ forloop.counter0 }}----{{ i }}</li> {% empty %} <li>this is empty!</li> {% endfor %} # [11, 22, 33, 44, 55] # 0----11 # 1----22 # 2----33 # 3----44 # 4----55
5.列表为空时执行逻辑
django:
{% for item in 列表 %} {{forloop.counter}} {{ item }} <1-- 表示当前是第几次循环,从1开始 --> {{forloop.counter0}}{{ item }}
<!-- 表示当前是第几次循环,从0开始 --> {% empty %} 列表为空或不存在时执行此逻辑 {% endfor %}
jinja2:无
6.if语句
{% if num >= 100 and 8 %} {% if num > 200 %} <p>num大于200</p> {% else %} <p>num大于100小于200</p> {% endif %} {% elif num < 100 %} <p>num小于100</p> {% else %} <p>num等于100</p> {% endif %} {% if %} 标签接受and,or或者not来测试多个变量值或者否定一个给定的变量 {% if %} 标签不允许同一标签里同时出现and和or,否则逻辑容易产生歧义,例如下面的标签是不合法的: {% if obj1 and obj2 or obj3 %}
7.过滤器
django:
变量|过滤器:参数
jinja2:变量 | 过滤器(参数) 常见的jinja2过滤器:https://www.cnblogs.com/chichung/p/9775099.html
django的常见几个过滤器如下:
- safe,禁用html转义(显示html标签样式,而不是字符串)
- length,长度,返回字符串包含字符的个数,或列表、元组、字典的元素个数。
default,默认值,如果变量不存在时则返回默认值。
data|default:'默认值'
date,日期,用于对日期类型的值进行字符串格式化,常用的格式化字符如下:
- Y表示年,格式为4位,y表示两位的年。
- m表示月,格式为01,02,12等。
- d表示日, 格式为01,02等。
- j表示日,格式为1,2等。
- H表示时,24进制,h表示12进制的时。
- i表示分,为0-59。
- s表示秒,为0-59。
value|date:"Y年m月j日 H时i分s秒"
1 add : 给变量加上相应的值 # # 2 addslashes : 给变量中的引号前加上斜线 # # 3 capfirst : 首字母大写 # # 4 cut : 从字符串中移除指定的字符 # # 5 date : 格式化日期字符串 # # 6 default : 如果值是False,就替换成设置的默认值,否则就是用本来的值 # # 7 default_if_none: 如果值是None,就替换成设置的默认值,否则就使用本来的值 #实例: #value1="aBcDe" {{ value1|upper }}<br> #value2=5 {{ value2|add:3 }}<br> #value3='he llo wo r ld' {{ value3|cut:' ' }}<br> #import datetime #value4=datetime.datetime.now() {{ value4|date:'Y-m-d' }}<br> #value5=[] {{ value5|default:'空的' }}<br> #value6='<a href="#">跳转</a>' {{ value6 }} {% autoescape off %} {{ value6 }} {% endautoescape %} {{ value6|safe }}<br> {{ value6|striptags }} #value7='1234' {{ value7|filesizeformat }}<br> {{ value7|first }}<br> {{ value7|length }}<br> {{ value7|slice:":-1" }}<br> #value8='http://www.baidu.com/?a=1&b=3' {{ value8|urlencode }}<br> value9='hello I am yuan'
8.多行注释
django:
{% comment %} ... {% endcomment %}
9.对有需要的block进行重写
django:
- 不用重写父模版中的所有block,如果子模版没有重写,则使用父模版定义的默认值。
-
可以使用
block.super
来包含父模板的块中定义的内容,如下
{% block 名称 %} 子模板的内容 {{ block.super }} 显示父模板中block的内容 {% endblock %}
{{ block.super }}——引用上级代码块在其基础上进行一些修改
flask:
同样原理,不过用的是{{ super() }}