15、flask-模型-models-表的操作-分页paginate()
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参数默认值为1 page = 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样式:
列表渲染
分页按钮渲染:
以下是代码:
app.py
from App import create_app app = 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 = i users.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() #清空session return '添加失败' + 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 = 200 db.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 desc print(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参数默认值为1 page = 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_exts def 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_uri app.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">«</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">»</span> </a> </li> </ul> </div> </body> </html>
目录如下:
展示:
本文作者:little小新
本文链接:https://www.cnblogs.com/littlecc/p/18327115
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
标签:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了