我需要做类似的事情。在观看 Corey Schafer 关于分页的 Flask 教程后,我找到了一个简单的方法。我需要对其进行一些更改,因为我不使用数据库(具有用于分页的内置功能)。我的编码方式如下:
@app.route('/home')
def home(): #this doesn't make a request
#pagination
current_page = request.args.get('page', 1, type=int)
#the variable page will store the (integer) part after '?page=' from the url
#http://localhost:5000/?page=1
#http://localhost:5000/?page=2
#pages, per page
items_per_page= 20
pages = round(len(item_list)/items_per_page+ .499) #the .499 is for rounding to the upside
from_page = int(page) * items_per_page - items_per_page #36 per page
upto_page = int(page) * items_per_page
list_part = item_list[from_page:upto_page]
return render_template('displayitems.html', list_part=list_part, pages=pages, current_page=current_page)
因此,您无需提供完整列表item_list=item_list,而是提供该列表的一部分list_part=list_part。在模板中渲染分页:
{% for page_num in range(1, pages) %}
{% if page_num in [1, 2, 3, current_page, current_page-1, current_page+1, pages-3, pages-2, pages-1] %}
{% if current_page == page_num %}
<a class="btn btn-info mb-4" href="{{ url_for('home', page=page_num) }}">{{ page_num }}</a>
{% else %}
<a class="btn btn-outline-info mb-4" href="{{ url_for('home', page=page_num) }}">{{ page_num }}</a>
{% endif %}
{% elif current_page > 4 and page_num == 4 %}
....
{% elif current_page < pages-4 and page_num == pages-4 %}
....
{% endif %}
{% endfor %}
我没有使用下一个/上一个按钮(当我有解决方案和时间时,我会添加这个)。但即使是长列表也有很好的样式,用省略号表示有更多页面但不显示所有页面。活动页面的按钮有一个不同的类,用于显示您在哪个页面上。
您可以通过更改 url 中 ?page= 之后的整数来快速转到页面:http://localhost:5000/?page=1
编辑:
要添加下一个/上一个按钮,请将以下 Flask if 块放在 for 循环之外。
{% if current_page != 1 %}
<a class="btn btn-outline-info mb-4" href="{{ url_for('home', page=current_page-1) }}"><<</a>
{% endif %}
{% for page_num in range(1, pages) %}
...........[SAME PART AS ABOVE]..........
{% endfor %}
{% if current_page != pages %}
<a class="btn btn-outline-info mb-4" href="{{ url_for('home', page=current_page+1) }}">>></a>
{% endif %}