Django基于类的分页功能实现详解

阿麦
阿麦
发布时间:2026-10-13| 6人浏览过
原创

本文介绍如何在Django个人博客开发中实现基于类的分页功能。通过定义Page类,封装页码计算、数据过滤及HTML生成功能,支持自定义每页文章数和最大展示页码。文章提供完整代码示例,解析构造函数与核心方法,并展示不同文章数量下的分页效果,帮助开发者快速集成高效的分页模块。

Django分页功能概述

在开发个人博客系统时,分页功能的实现是不可或缺的一环。常见的实现方式主要分为函数式和类式两种。本文将重点介绍如何基于类来实现分页功能,并提供详细的代码实现方案。


class Page:
 page_num = 0
 total_count = 0
 tartype = ""
 total_page = 0 # 总页数
 per_page = 8 # 每页显示8篇文章
 max_page = 11 # 每页最大展示页数选项
 half_page = max_page // 2
 category = "" # 标记该链接所属分类ID,首页默认为空

 def __init__(self, page_num, total_count, tartype, category):
 """
 初始化函数:接收页码数、总数据数,计算总页码数并过滤错误页码数据
 :param page_num: 页码数
 :param total_count: 总数据数
 :param tartype: 分类值
 :param category: 所属分类ID
 """
 self.page_num = page_num
 self.total_count = total_count
 self.tartype = tartype
 self.total_page, m = divmod(self.total_count, self.per_page) # 总页码数,余数为m
 if category:
  self.category = category
 if m:
  self.total_page += 1
 if self.total_page < self.max_page:
  self.max_page = self.total_page
  self.half_page = self.max_page // 2
 # 过滤错误get数据
 if self.page_num > self.total_page:
  self.page_num = self.total_page
 elif self.page_num < 1:
  self.page_num = 1

 def data_start(self):
 return (self.page_num - 1) * self.per_page

 def data_end(self):
 return self.page_num * self.per_page

 def page_html(self):
 # 计算页数选项
 page_start = self.page_num - self.half_page
 page_end = self.page_num + self.half_page
 if page_start <= 1:
  page_start = 1
  page_end = self.max_page
 if page_end >= self.total_page:
  page_end = self.total_page
  page_start = self.total_page - self.max_page + 1
 # 计算上一页下一页选项
 if self.page_num == 1:
  last_page = self.page_num
  next_page = self.page_num + 1
 else:
  if self.page_num == self.total_page:
  last_page = self.page_num - 1
  next_page = self.page_num
  else:
  last_page = self.page_num - 1
  next_page = self.page_num + 1
 print(self.category)
 html_str_list = []
 html_str_list.append('<li><a href="/{}/?page={}{}" >«</a></li>'.format(self.tartype, last_page, self.category))
 for i in range(page_start, page_end + 1):
  if i == self.page_num:
  tmp = '<li><a class="active" href="/{}/?page={}{}" >{}</a></li>'.format(self.tartype, i, self.category, i)
  html_str_list.append(tmp)
  continue
  tmp = '<li><a href="/{}/?page={}{}" >{}</a></li>'.format(self.tartype, i, self.category, i)
  html_str_list.append(tmp)
 html_str_list.append('<li><a href="/{}/?page={}{}" >»</a></li>'.format(self.tartype, next_page, self.category))
 page_html = "".join(html_str_list)
 return page_html

开发者可以通过调整per_page参数来控制每页展示的文章数量,同时通过max_page参数设定分页模块中最大可展示的页码选项数量。

类实现核心逻辑

核心实现思路如下:首先创建一个Page类的实例,初始化时需传入四个关键参数:page_num(当前请求的页码)、total_count(数据库中的总文章数)、tartype(用于区分页面类型,如首页index或分类页category,其中category为具体的分类ID,若为首页则传空值)以及category(所属分类ID,首页时该值为空)。这些参数可根据具体业务需求进行灵活调整。在构造函数内部,系统会自动计算总页数,并对传入的错误页码数据进行过滤处理。后续若需使用分页功能,直接调用该类提供的相应方法即可。

关键方法解析

该类主要包含以下三个核心方法:data_start()用于计算当前页文章在数据列表中的起始索引;data_end()用于计算当前页文章在数据列表中的结束索引;page_html()负责生成分页导航模块的HTML代码,该代码可直接通过render函数渲染至前端页面。

功能效果展示

以下是该分页功能在实际运行中的效果展示。

当博客文章数量较少时,分页模块的显示效果如下。

当博客文章数量较多时,分页模块的显示效果如下。

以上就是本文关于Django基于类分页功能的完整介绍,希望能为各位的学习和工作带来帮助。欢迎持续关注本站,获取更多技术分享。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。