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/,结果如下:
阅读剩余
版权声明:
作者:雪落长安
链接:https://blog.wlbc321.cn/index.php/2021/05/18/flask6/
文章版权归作者所有,未经允许请勿转载。
THE END