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>
最后效果如下:
列表页码如果大于等于5个的话,始终只显示5个页码。
内容版权声明:除非注明,否则皆为本站原创文章。