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 %}">&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 %} {% endif %}
        <a href="{% if pagination.has_next %}{{ url_for(endpoint,page = pagination.page + 1, **kwargs) }}{% else %}#{% endif %}">&raquo;</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 %}

猜你喜欢

转载自www.cnblogs.com/hzjdpawn/p/12687127.html