Flask-- (七) Flask-SQLAlchemy分页

1、Flask-SQLAlchemy分页

随着项目运行的时间,数据会逐渐增多,为了更好的展示数据,从而有了分页这个需求。

Flask-SQLAlchemy分页,包装了分页的功能对象。

paginate(page=None, per_page=None, error_out=True, max_per_page=None)

参数描述
page指定页码,从1开始
per_page每一页有几个项
error_out是否抛出错误,当其为True时,在以下情况会抛出404
max_per_page当指定了max_per_page时,per_page会受到这个值的限制

常用方法

方法名称描述
has_next是否还有下一页
has_prev是否还有下一页
items当前页的元素集合
next返回下一页的Pagination对象
next_num下一页的页码
page当前页的页码
pages匹配的元素在当前配置一共有多少页
per_page每一页显示的元素个数
prev上一页的Pagination对象
prev_num上一页的页码
query创建Pagination对象对应的query对象
total匹配的元素总数

案例:职员的分页实现

# 路由

@user_print.route('/person')
@login_check
def person():
    department_type = request.args.get("dy", default="")
    person_username = request.args.get("person_username", default="")
    page_size = 10  # 每页的个数
    page_now = int(request.args.get("page_now", default=1))
    if person_username:
        # 根据输入的内容查询用户名
        person_username_search = f"%{person_username}%"
        person_query = Person.query.filter(Person.username.like(person_username_search))
    elif department_type:
        # 根据部门查询员工
        person_query = Person.query.outerjoin(Position).outerjoin(Department).filter(Department.id == department_type)
    else:
        # 未携带任何参数,查询所有
        person_query = Person.query
    # 根据上面查询后的query对象进行排序分页处理
    my_paginate = person_query.order_by(Person.id.desc()).paginate(page=page_now, per_page=page_size)
    if page_now > 2:
        page_range = range(1, my_paginate.pages + 1)[page_now - 3: page_now + 2]
    else:
        page_range = range(1, my_paginate.pages + 1)[:5]
    d_list = Department.query.all()
    return render_template('person.html', **locals())
<!--模板渲染-->

<div class="row">
    <div class="col-lg-8">
        {% for i in d_list %}
        {#  循环渲染部门按键  #}
        <a class="btn btn-default" href="/person?dy={{ i.id }}">{{ i.name }}</a>
        {% endfor %}

    </div>
    {#  职员搜索表单,get请求  #}
    <form role="form" class="col-lg-3" method="get" action="/person">
        <div class="form-group input-group">
            <input type="text" name="person_username" class="form-control" placeholder="输入要搜索的雇员的名字"
                   value="{{ person_username | default("", boolean=True) }}">
            <span class="input-group-btn">
                <button class="btn btn-default" type="submit">
                    <i class="fa fa-search"></i>
                </button>
            </span>
        </div>
    </form>
    <div class="col-lg-1">
        <a class="btn btn-default" href="/add_person">添加</a>
    </div>
</div>
{#  职员信息展示  #}
<div class="row">
    <table class="table">
        <thead>
            <tr>
                <th>职员用户名</th>
                <th>职员部门</th>
                <th>职员职位</th>
                <th>操作</th>
            </tr>
        </thead>
        <tbody>
            {% for i in my_paginate.items %}
            <tr>
                <td>{{ i.username }}</td>
                <td>{{ i.person_position_map.position_department_map.name }}</td>
                <td>{{ i.person_position_map.name }}</td>
                <td>
                    <a class="btn btn-default" href="/detail_person/{{ i.id }}">详情</a>
                    <a class="btn btn-default" href="/edit_person/{{ i.id }}">编辑</a>
                    <a class="btn btn-default" href="/delete_person/{{ i.id }}">删除</a>
                </td>
            </tr>
            {% endfor %}

        </tbody>
        <tfoot>
            <tr>
                <td colspan="4">
                    <ul class="pagination">
                        {% for i in page_range %}
                        {% if i == my_paginate.page %}
                        <li class="active"><a href="/person?page_now={{ i }}&person_username={{ person_username }}&dy={{ department_type }}">{{ i }}</a></li>
                        {% else %}
                        <li><a href="/person?page_now={{ i }}&person_username={{ person_username }}&dy={{ department_type }}">{{ i }}</a></li>
                        {% endif %}
                        {% endfor %}
                    </ul>
                </td>
            </tr>
        </tfoot>
    </table>
</div>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值