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>