Flask-SQLAlchemy 实现分页功能详解与代码示例
本文介绍如何在 Flask 中使用 Flask-SQLAlchemy 实现数据分页功能。通过定义 Employee 模型,利用 paginate 方法获取分页对象,并在 Jinja2 模板中通过 .items 访问数据及自定义 helper.html 渲染分页控件。详细解析 has_next、has_prev 等关键属性,提供完整的视图函数与模板代码示例,帮助开发者快速实现高效的数据列表展示。
Flask-SQLAlchemy 是 Flask 框架中用于数据库管理的扩展库。本文将通过一个员工信息展示的示例来演示其具体用法。
首先,需要创建 SQLAlchemy 对象 db,作为数据库操作的入口。
from flask import Flask, render_template,request from flask_sqlalchemy import SQLAlchemy app = Flask(__name__,static_url_path='') app.debug = True app.secret_key = "faefasdfaf" app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///./db/personal.db' # app的配置,指定数据库路径 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True app.config['SQLALCHEMY_ECHO'] = True db = SQLAlchemy(app)
接着,利用该 db 对象定义员工数据表结构。
from datetime import datetime
class Employee(db.Model):
'''员工'''
__tablename__ = 'employee'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
gender = db.Column(db.String)
job = db.Column(db.String)
birthday = db.Column(db.DateTime)
idcard = db.Column(db.String)
address = db.Column(db.String)
salary = db.Column(db.String)
release_time = db.Column(db.DateTime)
def __init__(self, name, gender, job, birthday, idcard, address, salary, release_time=None):
self.name = name
self.gender = gender
self.job = job
self.birthday = birthday
self.idcard = idcard
self.address = address
self.salary = salary
self.release_time = release_time if release_time else datetime.now()
def __repr__(self):
return '<员工{},{},{},{}>'.format(self.id, self.name, self.salary, self.address)
数据表创建完成后,即可对表中的数据进行查询操作。
from flask import render_template
from flask.views import MethodView
class EmployeeListView(MethodView): # 获取员工信息
def get(self,page=1):
employees = Employee.query.paginate(page,per_page=10)
return render_template('employeelist.html', employees=employees)
上述步骤展示了如何查询员工信息并将其传递给前端模板。此处采用了 Flask 的蓝图机制进行模块化开发,假设该视图函数命名为 employee.list。
注意:paginate 是用于分页的核心方法,其第一个参数指定页码,第二个参数指定每页显示的记录数量。需要注意的是,该方法返回的结果并非直接的列表,在传递给前端模板时,必须通过 .items 属性获取实际的数据列表,具体示例如下。
{% for item in employees.items %}
如上所示,在使用 Jinja2 模板遍历数据时,必须在后台传递的分页对象后添加 .items 以获取可迭代的列表。
继续完善分页功能,我们需要再次利用 Jinja2 模板定义一个辅助方法,用于生成分页导航控件,该模板文件命名为 helper.html。
{% macro render_page_data(page_data,page_function) %}
<div class="text-center">
<ul class="page_data">
<li><a href="{{ url_for(page_function,page = 1) }}">首页</a></li>
{% if page_data.has_prev %}
<li><a href="{{ url_for(page_function,page = page_data.prev_num) }}">«</a></li>
{% endif %}
{% for page in page_data.iter_pages() %}
{% if page %}
{% if page !=page_data.page %}
<li><a href="{{ url_for(page_function,page = page) }}">{{ page }}</a></li>
{% else %}
<li class="active"><a href="#">{{ page }}</a></li>
{% endif %}
{% endif %}
{% endfor %}
{% if page_data.has_next %}
<li><a href="{{ url_for(page_function,page = page_data.next_num) }}">»</a></li>
{% endif %}
<li><a href="{{ url_for(page_function,page = page_data.pages) }}">末页</a></li>
</ul>
</div>
{% endmacro %}
上述代码利用 Jinja2 语法定义了一个分页渲染方法,该方法接收两个参数:第一个是从后台通过 db 分页查询得到的数据对象,第二个是对应的查询方法名。
这里需要特别说明分页数据对象中几个重要的属性和方法:
- has_next:若当前页之后至少存在一页,则返回 True。
- has_prev:若当前页之前至少存在一页,则返回 True。
- next_num:下一页的页码数值。
- prev_num:前一页的页码数值。
完成上述准备工作后,最后一步是在模板页面中通过 Jinja2 导入刚才定义的辅助方法,即在 employeelist.html 中进行导入操作。
{% import 'helper.html' as helper %}
导入完成后,即可在页面需要的地方调用该方法。
{{ helper.render_pagination(employees,'employee.list') }}
上述代码即为调用之前定义的分页渲染方法。其中,第一个参数是从后台传递过来的分页数据对象,第二个参数是对应的后台视图函数名称。
完成以上操作后,功能即告完成,下面展示实现后的效果截图。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













