所需环境
Flask-SQLAlchemy
分页
使用Flask-SQLAlchemy提供的pagination()方法。页数是pagination()方法的第一个参数,也是唯一必须的参数。可选参数per_page用来指定每页显示的记录数。
参考代码:
def index():
# ...
page = request.args.get('page', 1, type=int)
pagination = Post.query.order_by(Post.timestamp.desc()).paginate(
page, per_page=current_app.config['FLASKY_POST_PER_PAGE'], error_out=False)
post = pagination.items
return render_template('index.html',form=form,posts=posts,pagination=pagination)
添加导航栏
pagination()方法的返回值是一个Pagination类对象,这个类在Flask-SQLAlchemy中定义。 这个对象包含很多属性,用于在模板中生成分页链接。
Jinja2宏实现的分页导航:
{% 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.prev_num, **kwargs) }}{% else %}#{% endif %}">
«
</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="#">…</a></li>
{% endif %}
{% endfor %}
<li{% if not pagination.has_next %} class="disabled"{% endif %}>
<a href="{% if pagination.has_next %}{{ url_for(endpoint, page=pagination.next_num, **kwargs) }}{% else %}#{% endif %}">
»
</a>
</li>
</ul>
{% endmacro %}