Flask用paginate实现数据分页
Posted hzjdpawn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask用paginate实现数据分页相关的知识,希望对你有一定的参考价值。
1,数据获取的视图函数
# 获取用户列表 @pawnxc.route("/user_list", methods=["GET", "POST"]) def user_list(): page = request.args.get(‘page‘, 1, type=int) pagination = Pawn_dl.query.order_by(Pawn_dl.ssfj.asc()).paginate(page, per_page=20, error_out=False) users = pagination.items # 得到辖区列表 fjs = PawnFj.query.order_by(PawnFj.fjdm) # 将查询结果对象转换为字典数据 ssfj_list = [] if fjs: for fj in fjs: ssfj_list.append(fj.to_dict()) return render_template(‘user_list.html‘, users=users, ssfj_list=ssfj_list, pagination=pagination)
从请求参数中获取页码(request.args),如果没有明确指定,则默认渲染第一页。
参数 type=int 保证参数无法转换成整数时,返回默认值。
为了显示某页中的记录,要把 all() 换成 Flask-SQLAlchemy 提供的 paginate() 方法。
页数是 paginate() 方法的第一个参数,也是唯一必需的参数。
可选参数 per_page 用来指定 每页显示的记录数量;如果没有指定,则默认显示 20 个记录。
另一个可选参数为 error_ out,当其设为 True 时(默认值),如果请求的页数超出了范围,则会返回 404 错误;如果 设为 False,页数超出范围时会返回一个空列表。
paginate() 方法的返回值是一个 Pagination 类对象,这个类在 Flask-SQLAlchemy 中定义。 这个对象包含很多属性,用于在模板中生成分页链接,因此将其作为参数传入了模板。
2,分页模板(flask_pagination.html):
<!--以 Jinja2 宏的形式实现的分页导航--> {% macro pagination_widget(pagination, endpoint) %} <ul class="pagination"> <li>{% if not pagination.has_prev %} {% endif %} <a href="{% if pagination.has_prev %}{{ url_for(endpoint,page = pagination.page - 1, **kwargs) }} {% else %}#{% endif %}">« </a> </li> {% for p in pagination.iter_pages() %} {% if p %} {% if p == pagination.page %} <li class="active"> <a href="{{ url_for(endpoint, page = p, **kwargs) }}">{{ p }}</a> </li> {% else %} <li> <a href="{{ url_for(endpoint, page = p, **kwargs) }}">{{ p }}</a> </li> {% endif %} {% else %} <li class="disabled"> <a href="#">…</a> </li> {% endif %} {% endfor %} <li>{% if not pagination.has_next %} {% endif %} <a href="{% if pagination.has_next %}{{ url_for(endpoint,page = pagination.page + 1, **kwargs) }}{% else %}#{% endif %}">»</a> </li> </ul> {% endmacro %}
3,在需要分页的HTML文件中引入此模板:
{% import "flask_pagination.html" as macros %} {%if pagination%} <div class="pagination"> {{ macros.pagination_widget(pagination, ‘.user_list‘) }} </div> {% endif %}
以上是关于Flask用paginate实现数据分页的主要内容,如果未能解决你的问题,请参考以下文章