Flask开发(六)Jinja2模板 Flask过滤器

内容纲要

本篇导读:

  • 常见过滤器
  • 自定义过滤器

过滤器本质上是一个转换函数,有时候我们不仅需要输出变量的值,还需要把某个变量的值修改后再显示出来,而在模板中不能直接调用Python中的某些方法,那么就需要用到过滤器。

常见的过滤器

1.与字符串相关的过滤器

  • <p>{{name|default('None',true)}}</p>

其中,name为变量名,如果name为空,则用None这个值去替换name。

  • <p>{{'hello'|capitalize}}</p>

将字符串hello转成Hello,实现首字母大写的目的。

  • <p>{{'HELLO'|lower}}</p>

将字符串HELLO全部转为小写。

  • <p>{{'hello'|replace('h','x')}}</p>

将hello中的h替换成x。

2.对列表进行操作的过滤器

  • <p>{{[01,80,42,44,77]|first}}</p>

取得列表中的首个元素01。

  • <p>{{[01,80,42,44,77]|last}}</p>

取得列表中的首个元素77。

  • <p>{{[01,80,42,44,77]|count}}</p>

取得列表长度,统计个数为5,count也可以使用length替代。

  • <p>{{[01,80,42,44,77]|sort}}</p>

列表中元素重新排序,默认按照升序排列。

  • <p>{{[01,80,42,44,77]|join(',')}}</p>

将列表中的元素合并为字符串,返回1,80,42,44,77。

3.对数值进行操作相关的过滤器

  • <p>{{18.8888|round}}</p>

四舍五入取得证书,返回19.0。

  • <p>{{18.8888|round(2,'floor')}}</p>

保留小数点后2位,返回结果为18.88,floor代表向下取整。

  • <p>{{-2|abs}}</p>

求绝对值,返回结果为2。

代码实例

下面以列表中的每间隔2行换颜色为例,详细说明模板中过滤器的使用方法。在templates文件夹下新建index.html文件,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>过滤器</title>
</head>
<body>
    <p>{{name|default('None',true)}}</p>
    <p>{{'hello'|capitalize}}</p>
    <p>{{'HELLO'|lower}}</p>
    <p>{{'hello'|replace('h','x')}}</p>
    <br>
    <p>{{[1,80,42,44,77]|first}}</p>
    <p>{{[1,80,42,44,77]|last}}</p>
    <p>{{[1,80,42,44,77]|count}}</p>
    <p>{{[1,80,42,44,77]|sort}}</p>
    <p>{{[1,80,42,44,77]|join(',')}}</p>
    <br>
    <p>{{18.8888|round}}</p>
    <p>{{18.8888|round(2,'floor')}}</p>
    <p>{{-2|abs}}</p>
</body>
</html>

app.py文件代码如下:

from flask import Flask,render_template

app = Flask(__name__)

@app.route('/')
def hello_world():
    return render_template('index.html')

if __name__ == '__main__':
    app.run(debug=True)

运行程序,使用浏览器访问http://127.0.0.1:5000/,结果如下:

自定义过滤器

内置的过滤器不满足需求怎么办?过滤器的实质就是一个转换函数,我们其实完全可以写出是属于自己的自定义过滤器。

通过调用应用程序实例的add_template_filter方法实现自定义过滤器。该方法的第一个参数是函数名,第二个参数是自定义过滤器的过滤器名称。

有一个商品列表页,需要每两行输出一条分割线,将index.html的代码修改如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>过滤器</title>
    <style type="text/css">
        .line{
            display: inline-block;
            height: 1px;
            width: 100%;
            background: #00ccff;
            overflow: hidden;
            vertical-align: middle;
        }
    </style>
</head>
<body>
    {% for good in goods %}
        <li style="list-style-type: none">
            {{ good.name }}
            <span class="{{ loop.index | index_class }}"></span>
        </li>
    {% endfor %}
</body>
</html>

上面代码对传递过来的列表进行遍历,每2行输出一条分割线,分割线样式由<style></style>标签中代码定义。

app.py的代码如下:

from flask import Flask,render_template,request

app = Flask(__name__)

@app.route('/')
def hello_world():  # 定义视图函数
    goods = [{'name': '怪味少女开衫外套春秋韩版学生bf原宿宽松运动风2018新款秋装上衣', 'price': 138.00},
             {'name': 'A7seven 复古百搭牛仔外套女秋季2018新款宽松显瘦休闲夹克衫上衣', 'price': 100.00},
             {'name': '黑色时尚西装外套女春秋中长款2018新款韩版休闲薄款chic西服上衣', 'price': 100.00},
             {'name': 'HAVE RICE饭馆 颜值超耐打 复古牛仔外套女短款 2018春秋新款上衣', 'price': 129.00}
             ]  # 定义列表goods
    return render_template('index.html', **locals())  # 渲染模板,并向模板传递参数

def do_index_class(index):
    if index % 2 ==0:
        return 'line'
    else:
        return ''
app.add_template_filter(do_index_class,'index_class')


if __name__ == '__main__':
    app.run(debug=True)

运行程序,访问http://127.0.0.1:5000/,结果如下:

阅读剩余
THE END