Flask用paginate实现数据分页

Flask分页也有几种方式,可以使用我们之前写的分页函数,可以查看我之前的笔记https://sulao.cn/post/552.html

也可以使用paginate模块来分页,paginate方法是flask-sqlalchemy提供的,下面我们来看看paginate的使用方法

paginate的用法

paginate(page, per_page, error_out=True)
page 当前页数
per_page 每页显示的条数
error_out 是否打印错误信息
paginate的属性
paginate.page 当前页数
paginate.pages 总页数
paginate.total 数据总条数
paginate.has_prev 是否存在上一页
paginate.has_next 是否存在下一页
paginate.iter_pages() 所有页码 返回列表 如[1, 2, 3, 4]
paginate(page, per_page,error_out).items 返回当前页的所有数据

视图函数

@stu.route('/stupage/')
def stu_page():
    page = int(request.args.get('page', 1))
    per_page = int(request.args.get('per_page', 2))
    paginate = Student.query.order_by('-s_id').paginate(page, per_page, error_out=False)
    stus = paginate.items
    return render_template('stupage.html', paginate=paginate, stus=stus)

前端页面

当前页数:{{ paginate.page }}
总页数:{{ paginate.pages }}
一共有{{ paginate.total }}条数据
{% if paginate.has_prev %}
        <a href="/stu/stupage/?page={{ paginate.prev_num }}">上一页</a>
{% endif %}
页码:
{% for i in paginate.iter_pages() %}
        <a href="/stu/stupage/?page={{ i }}">{{ i }}</a>
{% endfor %}
{% if paginate.has_next %}
        <a href="/stu/stupage/?page={{ paginate.next_num }}">下一页</a>
{% endif %}

也可以使用jinja2宏的形式进行分页,这也可以复用

分页模板(_macros.html)

{% macro pagination_widget(pagination, endpoint) %}
    <ul class="pagination">
        <li{% if not pagination.has_prev %} class="disabled"{% endif %}>
            <a href="{% if pagination.has_prev %}{{ url_for(endpoint,page = pagination.page - 1, **kwargs) }}
            {% else %}#{% endif %}">&laquo;
            </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="#">&hellip;</a>
            </li>
            {% endif %}
        {% endfor %}
        <li{% if not pagination.has_next %} class="disabled"{% endif %}>
            <a href="{% if pagination.has_next %}{{ url_for(endpoint,page = pagination.page + 1, **kwargs) }}{% else %}#{% endif %}">&raquo;</a>
        </li>
    </ul>
{% endmacro %}

然后就是在需要分页的地方引入此模板

{% import "_macros.html" as macros %} 
..........其他代码省略...........
{%if pagination%}
    <div class="pagination">
        {{ macros.pagination_widget(pagination, '.index') }}
    </div>
{% endif %}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/711.html