15、flask-模型-models-表的操作-分页paginate()

news/2024/9/8 10:51:36/文章来源:https://www.cnblogs.com/littlecc/p/18327115

paginate()的属性

属性名 说明
items 返回当前页的内容列表
has_next 是否还有下一页
has_prev 是否还有上一页
next(error_out=False) 返回下一页的pagination对象
prev(error_out=False) 返回上一页的Pagination对象
page 当前页的页码
pages 总页数
per_page 每页显示的数量
prev_num 上一页页码数
next_num 下一页页码数
total 查询返回记录总数

案例1 - 属性的使用

# 分页,翻页
# 方案1. 手动翻页
#  offset(): 查询指定条数,从指定位置开始
#  limit(): 查询指定条数
#  page=1 页码
# 每页显示的数量:per_page=5
# page=1:1 2 3 4 5  => offset(0).limit(5)
# page=2:6 7 8 9 10 => offset(5).limit(5)
# page=3:11 12 13 14 15 => offset(10).limit(5)
# page=4:16 17 18 19 20 => offset(15).limit(5)
# ...
# page=n:     => offset((page-1)*per_page).limit(per_page)# 方案2.paginate 翻页
@blue.route('/paginate/')
def get_paginate():# 页码:如果没有传page参数默认值为1page = int(request.args.get('page', 1))# per_page:每页显示的数量,默认每页显示5条数据per_page = int(request.args.get('per_page', 5))# print(page, type(page))# print(per_page, type(per_page))# paginate()p = User.query.paginate(page=page, per_page=per_page, error_out=False)print(p.items)  # 打印当前页的数据print(p.has_next)   # 是否有下一页print(p.has_prev)   # 是否有上一页print(p.next(error_out=False).items)  # 返回下一页的pagination的对象 加上items属性表示当前页的数据print(p.prev(error_out=False).items)  # 返回上一页的pagination的对象print(p.page)   # 当前页码 从1开始print(p.pages)  # 总页数print(p.per_page)   # 每页显示的数量print(p.prev_num)   # 上一页页码数print(p.next_num)   # 下一页页码数print(p.total)  # 总条数return render_template('paginate.html')# 浏览器:http://localhost:5000/paginate/?page=2&per_page=4 传参

案例2 - 结合前端展示

扩展 - 前端渲染

参考bootstrap官网

使用bootstrap样式:
列表渲染

分页按钮渲染:

以下是代码:

app.py

from App import create_appapp = create_app()if __name__ == '__main__':app.run(debug=True)# 运行: flask run --debug

views.py

from flask import Blueprint, request, render_template
from sqlalchemy import desc, and_, or_, not_from .models import *#创建蓝图(路由)
blue = Blueprint('user', __name__)@blue.route('/')
def index():return 'index'# 创建对象: 对象名(自定义) = 类名()     -- > 该对象指的是models中的类
# 对象.属性名 = 表字段的值# 单表操作 - 增删改查
# 1.增
@blue.route('/useradd/')
def user_add():# #添加一条数据# # 创建对象# user = User()# user.name = '张三'# user.age = 18# db.session.add(user)    #将对象user添加到session中# db.session.commit()     #将session中的数据提交到数据库中#添加多条数据users = []for i in range(10, 30):user = User()user.name = '张' + str(i)user.age = iusers.append(user)try:db.session.add_all(users)    #将对象user添加到session中, all添加多个对象db.session.commit()     #将session中的数据提交到数据库中  事务提交except Exception as e:db.session.rollback()   #回滚db.session.flush()  #清空sessionreturn '添加失败' + str(e)#因为这里name是唯一值、所以如果重复添加会报错,将错误打印出来return '添加成功'# 2.删
# 先查到要删除的数据,再执行删除
@blue.route('/userdel/')
def user_del():# 先查到要删除的数据user = User.query.first()   #查询第一条数据db.session.delete(user)db.session.commit()return '删除成功'# 3.改
@blue.route('/userupdate/')
def user_update():# 先查到要修改的数据user = User.query.first()user.age = 200db.session.commit()return '修改成功'# 4.查
@blue.route('/userget/')
def user_get():# all(): 查询所有数据users = User.query.all()    #查询所有数据# print(users)    #打印的是对象、如果models中有__repr__方法,打印的是对象的属性值、如果没有__repr__方法,打印的是对象的内存地址# print(User.query)   #打印的是sql语句# filter(): 过滤, 过滤条件,类似where 、支持链式查询、得到的是查询集users = User.query.filter()# print(users)# get(): 根据主键查询、如果没有找到,返回None、user = User.query.get(10)# print(user)# print(user.name, user.age)  # 打印对象的属性值# filter()与filter_by()的区别# filter()  # 类似where、支持不等值的条件查询、但条件要:对象.属性名# filter_by()   #用于等值 = 操作的过滤条件,而不支持 > < 等不等值的条件查询# users = User.query.filter(User.age==18)   ##users = User.query.filter(User.age>18)     #返回的是查询集users = User.query.filter_by(age=18)        #可以直接属性值查询# users = User.query.filter_by(age>18)      #这是不支持的所以会报错# print(list(users))  # 打印查询集使用list()强转打印# first(): 查询第一条数据# last(): 查询最后一条数据user = User.query.first()# user = User.query.last()user = User.query.first_or_404()print(user.name, user.age)# count(): 查询数据条数count = User.query.count()print(count)# limit(): 查询指定条数# offset(): 查询指定条数,从指定位置开始users = User.query.offset(3).limit(4)print(list(users))# order_by(): 排序users = User.query.order_by('age')  # 升序users = User.query.order_by(desc('age'))  # 降序  需要导入 from sqlalchemy import descprint(list(users))# 逻辑运算 and_ , or_ , not_users = User.query.filter(User.age>20, User.age<30) # 且运算users = User.query.filter(and_(User.age>20, User.age<30))users = User.query.filter(or_(User.age>20, User.age<30))users = User.query.filter(not_(User.age>20))print(list(users))# 查询属性users = User.query.filter(User.name.contains('张'))  # 模糊查询 类似 like# in_() : 查询属性users = User.query.filter(User.name.in_(['张三', '李四']))  # 查找在列表中的数据# startswith(): 查询以什么开头的数据users = User.query.filter(User.name.startswith('张'))# endswith(): 查询以什么结尾的数据users = User.query.filter(User.name.endswith('三'))# __gt__: 大于# __lt__: 小于# __ge__: 大于等于# __le__: 小于等于users = User.query.filter(User.age.__gt__(20))users = User.query.filter(User.age.__ge__(20))users = User.query.filter(User.age.__le__(20))print(list(users))return '查询成功'# 分页,翻页
# 方案1. 手动翻页
#  offset(): 查询指定条数,从指定位置开始
#  limit(): 查询指定条数
#  page=1 页码
# 每页显示的数量:per_page=5
# page=1:1 2 3 4 5  => offset(0).limit(5)
# page=2:6 7 8 9 10 => offset(5).limit(5)
# page=3:11 12 13 14 15 => offset(10).limit(5)
# page=4:16 17 18 19 20 => offset(15).limit(5)
# ...
# page=n:     => offset((page-1)*per_page).limit(per_page)# 方案2.paginate 翻页
@blue.route('/paginate/')
def get_paginate():# 页码:如果没有传page参数默认值为1page = int(request.args.get('page', 1))# per_page:每页显示的数量,默认每页显示5条数据per_page = int(request.args.get('per_page', 5))# print(page, type(page))# print(per_page, type(per_page))# paginate()p = User.query.paginate(page=page, per_page=per_page, error_out=False)print(p.items)  # 打印当前页的数据print(p.has_next)   # 是否有下一页print(p.has_prev)   # 是否有上一页print(p.next(error_out=False).items)  # 返回下一页的pagination的对象 加上items属性表示当前页的数据print(p.prev(error_out=False).items)  # 返回上一页的pagination的对象print(p.page)   # 当前页码 从1开始print(p.pages)  # 总页数print(p.per_page)   # 每页显示的数量print(p.prev_num)   # 上一页页码数print(p.next_num)   # 下一页页码数print(p.total)  # 总条数return render_template('paginate.html', p=p)    # 渲染模板 , p表示pagination的对象# 浏览器:http://localhost:5000/paginate/?page=2&per_page=4 传参

models.py

# 模型数据库from .exts import db    #导入db对象# 模型     对应数据库中的     数据库
# 类名                      表             (对表操作就是对类操作)
# 对象(变量值)               表的一行数据
# 类属性(变量名)             表字段# 创建对象: 对象名(自定义) = 类名()
# 对象.属性名 = 表字段的值# 模型: 类名
# 必须继承:db.Model  才是 一个模型
class User(db.Model):# 表名__tablename__ = 'user'# 字段id = db.Column(db.Integer, primary_key=True, autoincrement=True)name = db.Column(db.String(50), unique=True)age = db.Column(db.Integer, default=1)# 打印对象的名字def __repr__(self):return self.name    # 返回对象的名字# db.Column :表示字段
# db.Integer :表示字段的类型 整数类型
# primary_key=true : 表示主键
# autoincrement=true : 表示自增
# db.String(50) : 表示字段的长度 相当于varchar(50)
# index=True : 表示创建索引
# db.Boolean : 表示布尔类型
# default=1 : 表示默认值
# db.Float : 表示浮点类型
# nullable=False : 表示不能为空

exts.py

from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate#初始化插件
db = SQLAlchemy()
migrate = Migrate()#和app对象绑定
def init_exts(app):db.init_app(app)migrate.init_app(app,db)

__init__.py

from flask import Flask
from .views import blue
from .exts import init_extsdef create_app():app = Flask(__name__)   # 创建flask应用#注册蓝图app.register_blueprint(blueprint=blue)#配置数据库db_uri = 'sqlite:///sqlite3.db'     #sqlite的配置# db_uri = 'mysql+pymysql://root:123456@127.0.0.1:3306/flask_db?charset=utf8mb4'  #mysql的配置app.config['SQLALCHEMY_DATABASE_URI'] = db_uriapp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False#初始化插件init_exts(app=app)return app

paginate.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>分页功能</title>{# 这里引入bootstrap样式 参考官网:https://v4.bootcss.com/docs/getting-started/introduction/ #}<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css" integrity="sha384-xOolHFLEh07PJGoPkLv1IbcEPTNtaed2xpHsD9ESMhqIYd0nLMwNLD69Npy4HI+N" crossorigin="anonymous"></head>
<body><div class="container"><h2>分页功能</h2><hr>{#  数据的展示  #}<ul class="list-group">{#  views.py视图函数中传过来的是 paginate对象,所以可以使用paginate对象的所有的属性 #}{% for user in p.items %}<li class="list-group-item">{{ user.name }}</li>{% endfor %}</ul><hr>{#  页脚的分页功能  #}<ul class="pagination">{# 上一页 #}<li class="page-item">{% if p.has_prev %} {# 如果有上一页,就翻页 #}<a class="page-link" href="/paginate/?page={{ p.prev_num }}&per_page=3" aria-label="Previous">{% else %}  {# 如果没有上一页,就禁用 #}<a class="page-link" href="javascript:;" aria-label="Previous">{% endif %}<span aria-hidden="true">&laquo;</span></a></li>{% for i in range(p.pages) %}{# 选中页码高亮 #}{% if p.page == i + 1 %}<li class="page-item active">{% else %}<li class="page-item">{% endif %}{# href="/paginate/?page={{ i + 1 }}" 点击页码跳转  &per_page=3固定页码数 #}<a class="page-link" href="/paginate/?page={{ i + 1 }}&per_page=3">{{ i + 1 }}</a></li>{% endfor %}{# 下一页 #}<li class="page-item">{% if p.has_next %}<a class="page-link" href="/paginate/?page={{ p.next_num }}&per_page=3" aria-label="Next">{% else %}<a class="page-link" href="javascript:;" aria-label="Next">{% endif %}<span aria-hidden="true">&raquo;</span></a></li></ul></div></body>
</html>

目录如下:

展示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/772654.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

01-从WordCount程序理解Spark术语及术语间的关系

1. 应用程序(Application) 通过下面的代码设置应用程序名称,设置后再UI中可以看到相应的名称。 //1.设置Application的名称 val conf = new SparkConf() conf.setAppName("WordCount") conf.setMaster("local")2. Job Job由scala的执行算子生成,每个执…

leetcode-5

题目: 给你一个字符串 s,找到 s 中最长的 回文子串 示例 1:输入:s = "babad"  输出:"bab"  解释:"aba" 同样是符合题意的答案。 示例 2:输入:s = "cbbd"   输出:"bb" 提示: 1 <= s.length <= 1000…

Uniapp 之手写签名

一、效果图二、代码示例 qianming.jsexport const qianming = {data() {return {windowWidth: 0,pixelRatio: 0,context: null,points: [],oldPoints: [],qm_width: 280,qm_height: 120,qm_img: }},methods: {qm_start() {const systemInfo = uni.getSystemInfoSync()this.wind…

代码随想录day11 || 150 逆表达式求值 239 滑动窗口最大值 347 前k最高频元素

150 逆波兰表达式计算func evalRPN(tokens []string) int {// 自己想是真的想不出来,看了视频之后有了思路// 本质上逻辑就是遇到数字入栈,遇到运算符号 出栈两个元素然后计算再入栈,最终就是计算结果stack := Constructor()for _, val := range tokens{// 如果数字入栈if i…

计算机组成与体系结构-校验码

奇偶校验码 奇偶校验是一种简单有效的校验方法,这种方法通过在编码中增加一位校验位来使编码中1的个数为奇数(奇校验)或者为偶数(偶校验),只能发现奇数个数据位 出错的情况.循环冗余校验码 CRC(Cyclic RedundancyCheck)循环冗余校验是一种常用的错误检测技术,用于在数据传输…

CAD快捷键命令大全(最全)

勇者无惧,强者无敌。

电影《抓娃娃》迅雷/百度云下载[超清版BT种子][MP4/2.89GB]分享

电影《抓娃娃》是一部由闫非、彭大魔联合执导,沈腾、马丽领衔主演的喜剧电影。该片于2024年7月16日在中国大陆正式上映,以其独特的剧情设定和深刻的主题探讨,迅速吸引了广大观众的关注。影片不仅延续了“沈马组合”一贯的幽默风格,更在喜剧外壳下包裹了深刻的教育主题,让人…

PWM波形生成

背景 方法 定时器 (1)高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线 (2)通用定时器timer2~timer5,通用定时器timer12~timer14以及基本定时器timer6,timer7的时钟来源是APB1总线 (3)当APB1和APB2分频数为1的时候,TIM1、TIM8~TIM…

ComfyUI插件:ComfyUI Impact 节点(一)

前言: 学习ComfyUI是一场持久战,而 ComfyUI Impact 是一个庞大的模块节点库,内置许多非常实用且强大的功能节点 ,例如检测器、细节强化器、预览桥、通配符、Hook、图片发送器、图片接收器等等。通过这些节点的组合运用,我们可以实现的工作有很多,例如自动人脸检测和优化修…

ComfyUI进阶:Comfyroll节点 (最终篇)+应用实例

前言: 学习ComfyUI是一场持久战,而Comfyroll 是一款功能强大的自定义节点集合,专为 ComfyUI 用户打造,旨在提供更加丰富和专业的图像生成与编辑工具。借助这些节点,用户可以在静态图像的精细调整和动态动画的复杂构建方面进行深入探索。Comfyroll 的节点设计简洁易用,功能…

松灵机器人scout mini小车 自主导航(4)——运行lio-sam建图

松灵机器人Scout mini小车运行lio-sam 在之前的工作中,我们已经实现了用小车搭载传感器,采用gmapping建图和navigation导航实现小车在2D环境中自主导航,但是实际我们采用的激光雷达多为三维激光雷达。因此决定采用lio-sam来建图。具体操作步骤如下。 1.下载雷达仿真 1.1下载…

[题解]P2672 [NOIP2015 普及组] 推销员

P2672 [NOIP2015 普及组] 推销员 为了便于操作,将住户信息按疲劳值从大到小排序。 那么对于选\(X\)个住户,有\(2\)种情况:选疲劳值前\(X\)大的住户,答案即为\(\sum\limits_{i=1}^X a[i] + 2\times \max\limits_{i=1}^X s[i]\)。 选疲劳值前\(X-1\)大的住户,然后在剩下的住…