flask自定义分页函数,包含展示页码数量

  • 2025-04-01 13:43:38
  • 开发
  • 85
  • shevechco

flask分页有好几个插件可以用,例如flask_paginate,还有sqlalchemy带的分页函数。那么我们没有使用sqlalchemy这个ORM库,使用的是peewee,我们对分页也有一些自己的要求,例如,我们想展示指定分页的页码数展示,例如本站始终展示5个页码,所以今天重写了下本站使用的分页函数,记录下来方便以后开发使用。

首先我们在flask的配置中添加几个配置,我的配置文件是setting.py,添加以下几行配置。

PAGE_SHOW = 5 #分页展示页码数量
PAGE_OFFSET = 2 #分页偏移数量

然后就是分页函数

from flask import current_app
#分页函数,total总页数,p是当前页码 def get_paginator(total, p): start = 1 end = total if total >= current_app.config["PAGE_SHOW"]: if p > current_app.config["PAGE_OFFSET"]: if total >= p + current_app.config["PAGE_OFFSET"]: start = p - current_app.config["PAGE_OFFSET"] end = p + current_app.config["PAGE_OFFSET"] else: start = total - current_app.config["PAGE_SHOW"] + 1 else: if total > current_app.config["PAGE_SHOW"]: end = current_app.config["PAGE_SHOW"] else: pass paginator = range(start, end+1) return paginator

在视图中调用这个函数

#首页/首页列表页
@article.route('/', methods=['GET'])
@article.route('/p/<int:p>', methods=['GET'])
def index(p=1):
    query = BPost.select().where(BPost.is_show == 1).order_by(BPost.id.desc())
    posts_list, total_pages = obj_select(query, p)
    #分页
    paginate = {
        "curr": p,
        "total_pages": total_pages,
        "page_list": get_paginator(total_pages, p)
    }
    return render_template('post/index.html',
                           title="首页",
                           cost_time=round((time.time()-g.start_time)*1000, 2),
                           posts_list=posts_list,
                           paginate=paginate)

最后就是在模板页面这样写

            <div class="paginate">
                <ul class="page_list">
                    {% if paginate["curr"]==1  %}
                    <li><em class="row-bg border-color layui-font-12 layui-disabled">上一页</em></li>
                    {% else %}
                    <li><a href="{{ url_for('article.index', p=paginate['curr']-1) }}" class="row-bg border-color layui-font-12">上一页</a></li>
                    {% endif %}
                    {% for page in paginate["page_list"] %}
                    {% if page==paginate["curr"]  %}
                    <li><em class="border-color layui-font-12">{{ page }}</em></li>
                    {% else %}
                    <li><a href="{{ url_for('article.index', p=page) }}" class="row-bg border-color layui-font-12">{{ page }}</a></li>
                    {% endif %}
                    {% endfor %}
                    {% if paginate["curr"]==paginate["total_pages"]  %}
                    <li><em class="row-bg border-color layui-font-12 layui-disabled">下一页</em></li>
                    {% else %}
                    <li><a href="{{ url_for('article.index', p=paginate['curr']+1) }}" class="row-bg border-color layui-font-12">下一页</a></li>
                    {% endif %} 
                </ul>
            </div>

最后效果如下:

202504011350363379111133.png

列表页码如果大于等于5个的话,始终只显示5个页码。

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

转载注明出处:http://www.sulao.cn/post/1012

相关推荐