首页 > 其他分享 >15、flask-模型-models-表的操作-分页paginate()

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

时间:2024-07-27 16:29:28浏览次数:13  
标签:__ 15 flask paginate db User print page user

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官网

使用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:[email protected]: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/[email protected]/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>

目录如下:

展示:

标签:__,15,flask,paginate,db,User,print,page,user
From: https://www.cnblogs.com/littlecc/p/18327115

相关文章

  • [RCTF2015]EasySQL 1
    目录题目分析源码分析注入位置正则过滤注入方式注入题目分析这道题目给源码了,但别人貌似都是黑盒做的,不管了,代码审计启动!源码分析注入位置注入的位置在changepwd.php<?phpsession_start();header("Content-Type:text/html;charset=UTF-8");require_on......
  • 基于Python flask 的豆瓣电影top250数据评分可视化
    跟着CSDN上学习一下爬虫和简单的可视化分析,最后完成了一个简单的小项目。1.项目简介        基于Pythonflask的豆瓣电影评分可视化。通过采用Python编程语言,使用flask框架搭建影视系统,并使用相关技术实现对豆瓣网站的爬取、数据存储和可视化分析。2、成果展示:......
  • 代码随想录day11 || 150 逆表达式求值 239 滑动窗口最大值 347 前k最高频元素
    150逆波兰表达式计算funcevalRPN(tokens[]string)int{ //自己想是真的想不出来,看了视频之后有了思路 //本质上逻辑就是遇到数字入栈,遇到运算符号出栈两个元素然后计算再入栈,最终就是计算结果 stack:=Constructor() for_,val:=rangetokens{ //如果数字入......
  • [题解]P2672 [NOIP2015 普及组] 推销员
    P2672[NOIP2015普及组]推销员为了便于操作,将住户信息按疲劳值从大到小排序。那么对于选\(X\)个住户,有\(2\)种情况:选疲劳值前\(X\)大的住户,答案即为\(\sum\limits_{i=1}^Xa[i]+2\times\max\limits_{i=1}^Xs[i]\)。选疲劳值前\(X-1\)大的住户,然后在剩下的住户中,距离比......
  • 14、flask-模型-models-表的操作-增删改查
    1.单表操作1.修改表结构接着上一步的数据迁移后、生成了表,接下来就要对表的操作这里稍微对表结构改了一下models.pyfrom.extsimportdb#导入db对象classUser(db.Model):#表名__tablename__='user'#字段id=db.Column(db.Integer,primar......
  • 如何将flask应用程序分成多个py文件?
    我的Flask应用程序当前由一个具有多个路径的文件组成,并定义了路径。有什么方法可以创建一个test.py文件,其中包含main()中未处理的路由吗?test2.py我担心test.py中的路由太多,并且希望使其可以[email protected]('/somepath')defsomehandler(......
  • 使用 Flask 时,为什么这个 html 模板不能在 Web 浏览器中呈现抓取的网站数据?
    每当我在终端中打印出抓取的数据时,它都会很好地显示抓取的数据,但每当我尝试使用PythonFlask提供它时,我使用的HTML模板不会在Web浏览器中呈现数据。如果您能帮我修复此代码。Python(Flask)文件:fromflaskimportFlask,render_templatefrombs4importBeautifulSoup......
  • python+flask计算机毕业设计社区疫情防控物资调配平台(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景近年来,全球公共卫生事件的频发,尤其是新冠疫情的爆发,对社区治理与应急响应能力提出了前所未有的挑战。社区作为疫情防控的第一线,其物资调配......
  • python+flask计算机毕业设计四川工商学院疫情防控系统的设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在全球新冠疫情持续蔓延的背景下,高校作为人员密集、流动性大的特殊场所,其疫情防控工作显得尤为重要。四川工商学院作为一所集教学、科研、......
  • python+flask计算机毕业设计企业人事管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着企业规模的不断扩大与业务复杂度的提升,传统的人事管理方式已难以满足现代企业对高效、精准、自动化管理的需求。企业人事管理涉及员工......