flask--Jinja2模板{% if %}标签 、{% for %}标签、测试器的使用

Published on with 0 views and 0 comments

在模板中,有时候我们避免不了对某些变量做一些判断,来实现我们的需求,而Jinja2模板也给我们提供了这个标签。

{% if %}标签

和python中的if语句相似,可以使用<,>,<=,>=,==,!=来进行判断,也可以通过and,or,not,()来进行逻辑合并操作。

假设我们在视图中传入了一个变量age,我们就可以根据age不同的值,在页面显示不同的信息.

{% if age < 18 %}
<p>还未成年,不能进网吧上网</p>
{% elif age == 18 %}
<p>刚刚成年,先去庆祝一下吧,再去上网</p>
{% else %}
<p>已经成年了,可以去网吧上网了</p>
{% endif %}

上面我们就通过if语句,对页面显示内容做了处理。

{% 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 %}

上面的代码是判断这个变量是否已经被定义.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

说你懂得生之微末,我便做了这壮大与你看,你说再热闹也终需离散,我便做了这一辈子与你看,你说冷暖自知,我便做了这冬花夏雪与你看,你说恋恋旧日好时光,我便做了这描金绣凤的浮世绘与你看。你说应愁高处不胜寒,我便拱手河山,讨你欢。