Flask-SQLAlchemy 实现分页功能详解与代码示例

叶初
叶初
发布时间:2026-10-13 | 2人浏览过
原创

本文介绍如何在 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') }}

上述代码即为调用之前定义的分页渲染方法。其中,第一个参数是从后台传递过来的分页数据对象,第二个参数是对应的后台视图函数名称。

完成以上操作后,功能即告完成,下面展示实现后的效果截图。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表