在模板中,有时候我们避免不了对某些变量做一些判断,来实现我们的需求,而Jinja2
模板也给我们提供了这个标签。
1. {% if %}标签
和python中的if
语句相似,可以使用<,>,<=,>=,==,!=
来进行判断,也可以通过and,or,not,()
来进行逻辑合并操作。
假设我们在视图中传入了一个变量age
,我们就可以根据age不同的值,在页面显示不同的信息.
{% if age < 18 %}
<p>还未成年,不能进网吧上网</p>
{% elif age == 18 %}
<p>刚刚成年,先去庆祝一下吧,再去上网</p>
{% else %}
<p>已经成年了,可以去网吧上网了</p>
{% endif %}
上面我们就通过if语句,对页面显示内容做了处理。
2. {% for %}标签
for循环可以遍历任何一个序列,包括列表,字典,元祖,并且可以反向遍历。
- 普通的遍历
<ul>
{% for user in users %}
<li>{{ user }}</li>
<!-- 如果没有值,空的列表之类的,就会执行else语句 -->
{% else %}
<li>没有任何值</li>
{% endfor %}
</ul>
- 遍历字典
{% for key,value in person.items() %}
<!--{% for key in person.keys() %} 遍历字典的key -->
<!--{% for value in person.values() %} 遍历字典的值 -->
<p>{{ key }} => {{ value }}</p>
{% endfor %}
但是在Jinja2模板中,没有continue
和break
语句,所以我们不能使用他们来控制我们的循环。但是Jinja2模板给我们提供了for循环中的其他一些变量。
变量 | 作用 |
---|---|
loop.index0 | 当前迭代对象的索引,从0开始 |
loop.index | 当前迭代对象的索引,从1开始 |
loop.revindex | 当前循环的反向索引,比如序列的长度为5,那么第一次循环这个值就为5,接下来每次减一 |
lopp.revindex0 | 当前循环的反向索引,从0开始,所以第一次的值为loop.length-1 |
loop.first | 是否为第一次迭代,反回True或False |
loop.last | 是否为最后一次迭代,返回True或False |
loop.length | 序列的长度 |
loop.previtem | 当前循环值得上一个值,如果为序列中的第一个值,那么上一个值就为空 |
loop.nextitem | 当前循环值得下一个值,如果为序列中的最后一个值,那么下一个值就为空 |
loop.cycle() | 辅助循环,看下面的例子 |
- loop.cycle()的使用
<!-- 假设 value=[1,2,3,4,5,6,7] -->
{% for value in values %}
<p class="{{ lopp.cycle('one','two') }}">{{ value }}</p>
{% endfor %}
<!-- 出来的效果为 -->
<p class="one">1</p>
<p class="two">2</p>
<p class="one">3</p>
<p class="two">4</p>
<p class="one">5</p>
<p class="two">6</p>
<p class="one">7</p>
在for循环中,也可以嵌套if语句。我们一九九乘法表为例:
- 不使用if
<table border="1">
<tbody>
{% for row in range(1,10) %}
<tr>
{% for colum in range(1,row+1) %}
<td>{{ row }} * {{ colum }} = {{ row*colum }}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
- 使用if
<table border="1">
<tbody>
{% for row in range(1,10) %}
<tr>
{% for colum in range(1,10) if colum <= row %}
<td>{{ row }} * {{ colum }} = {{ row*colum }}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
- for标签中嵌套if标签
<table border="1">
<tbody>
{% for row in range(1,10) %}
<tr>
{% for colum in range(1,10) %}
{% if colum <= row %}
<td>{{ row }} * {{ colum }} = {{ row*colum }}</td>
{% endif %}
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
测试器的使用
测试器主要是用来判断一个值是否满足某种类型,如果我们不使用测试器的话就非常不好判断。
语法如下:
- 一个参数测试器的使用方法
{% if <variable> is defined %}
do something ...
{% else %}
do something ...
{% endif %}
上面的代码是判断<variable>
这个变量是否已经被定义.Jinja2中还有很多其他的测试器。
- 两个参数的测试器的使用方法
{% if 9 is divisibleby 3 %}
<p>9能被三整除</p>
{% else %}
<p>9不能被三整除</p>
{% endif %}
测试器 | 描述信息 |
---|---|
callable(object) | 是否可调用 |
defined(object) | 是否被定义 |
escaped(object) | 是否应景被转义了 |
upper(object) | 是否全部大写 |
lower(object) | 是否全部小写 |
string(object) | 是否是一个字符窜 |
sequence(object) | 是否是一个序列 |
number(object) | 是否是一个数字 |
odd(object) | 是否是奇数 |
even(object) | 是否是偶数 |
divisibleby(value,num) | value是否能整除num |
sameas(value, other) | 判断一个对象是否指向另一个对象相同的内存地址 |
更多的测试器可以查看Jinja2的官方文档.http://jinja.pocoo.org/docs/2.10/templates/#list-of-builtin-tests