Django自定义分页效果

发布时间 - 2026-01-11 02:04:11    点击率:

分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该显示在页面上的数据在数据库表中的起始位置。

确定分页需求:

1. 每页显示的数据条数
2. 每页显示页号链接数
3. 上一页和下一页
4. 首页和末页

效果图:

首先,利用django内置的分页功能,写分页类:

from django.core.paginator import Paginator, Page  # 导入django分页模块


class PageInfo(object):
 def __init__(self, current_page, all_count, base_url, per_page=10, show_page=11):
  """

  :param current_page: 当前页
  :param all_count: 总页数
  :param base_url: 模板
  :param per_page: 每页显示数据条数
  :param show_page: 显示链接页个数
  """
  #若url错误,默认显示第一页(错误类型可能为:空页面编号,非整数型页面编号)
  try:
   self.current_page = int(current_page)
  except Exception as e:
   self.current_page = 1
  
  #根据数据库信息条数得出总页数   
  a, b = divmod(all_count, per_page)
  if b:
   a += 1
  self.all_page = a 
  
  self.base_url = base_url
  self.per_page = per_page
  self.show_page = show_page

 #当前页起始数据id
 def start_data(self):  
  return (self.current_page - 1) * self.per_page

 #当前页结束数据id
 def end_data(self):  
  return self.current_page * self.per_page
 
 #动态生成前端html
 def pager(self):
  page_list = []
  half = int((self.show_page - 1)/2)
  #如果:总页数 < show_page,默认显示页数范围为: 1~总页数
  if self.all_page < self.show_page:
   start_page = 1
   end_page = self.all_page + 1
  #如果:总页数 > show_page
  else:
   #如果:current_page - half <= 0,默认显示页数范围为:1~show_page
   if self.current_page <= half:
    start_page = 1
    end_page = self.show_page + 1
   else:
    #如果:current_page + half >总页数,默认显示页数范围为:总页数 - show_page ~ 总页数
    if self.current_page + half > self.all_page:
     end_page = self.all_page + 1
     start_page = end_page - self.show_page
    else:
     start_page = self.current_page - half
     end_page = self.current_page + half + 1

  #首页
  first_page = "<li><a href='%s?page=%s'>首页</a></li>" %(self.base_url, 1)
  page_list.append(first_page)

  #上一页(若当前页等于第一页,则上一页无链接,否则链接为当前页减1)
  if self.current_page <= 1:
   prev_page = "<li><a href='#'>上一页</a></li>"
  else:
   prev_page = "<li><a href='%s?page=%s'>上一页</a></li>" %(self.base_url, self.current_page-1)
  page_list.append(prev_page)

  #动态生成中间页数链接
  for i in range(start_page, end_page):
   if i == self.current_page:
    temp = "<li class='active'><a href='%s?page=%s'>%s</a></li>" %(self.base_url, i, i)
   else:
    temp = "<li><a href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i)
   page_list.append(temp)

  #下一页(若当前页等于最后页,则下一页无链接,否则链接为当前页加1)
  if self.current_page >= self.all_page:
   next_page = "<li><a href='#'>下一页</a></li>"
  else:
   next_page = "<li><a href='%s?page=%s'>下一页</a></li>" %(self.base_url, self.current_page+1)
  page_list.append(next_page)

  #末页(若总页数只有一页,则无末页标签)
  if self.all_page > 1:
   last_page = "<li><a href='%s?page=%s'>末页</a></li>" % (self.base_url, self.all_page)
   page_list.append(last_page)

  return ''.join(page_list)

然后,在views中写方法(此处写在app01中):

from utils.pagnition import PageInfo # 从文件中导入上步自定义的分页模块

def custom(request):
 all_count = models.UserInfo.objects.all().count() 
 # 获取要显示数据库的总数据条数
 page_info = PageInfo(request.GET.get('page'), all_count, '/custom.html/',)  
 # 生成分页对象
 user_list = models.UserInfo.objects.all()[page_info.start_data():page_info.end_data()]  
 # 利用分页对象获取当前页显示数据
 return render(request, 'custom.html', {'user_list': user_list, 'page_info': page_info}) 
 # 模板渲染

然后,在templates目录下写“custom.html"文件:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>customers</title>
{# 引入bootstrap样式#}
 <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
</head>
<body>
<h1>customers</h1>
{#当前页显示的数据#}
<ul>
 {% for row in user_list %}
  <li>{{ row.name }}</li>
 {% endfor %}
</ul>

{#分页#}
 <nav aria-label="Page navigation">
  <ul class="pagination">
{#    传入page_info.pager#}
   {{ page_info.pager|safe }}
  </ul>
 </nav>

</body>
</html>

最后,新增url关系(urls.py):

 from django.conf.urls import url
 from django.contrib import admin
 from app01 import views as app01_views
 
 urlpatterns = [
  url(r'^custom.html/$', app01_views.custom),
 ]

至此,就完成了利用django的分页功能自定义分页模块,可以应用在不同的业务页面上。

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


# Django  # 分页  # django实现分页的方法  # Django实现快速分页的方法实例  # Django自定义分页与bootstrap分页结合  # Django分页查询并返回jsons数据(中文乱码解决方法)  # Django实现简单分页功能的方法详解  # Django原生sql也能使用Paginator分页的示例代码  # Django实现分页功能  # Django rest framework实现分页的示例  # Django的分页器实例(paginator)  # Django实现网页分页功能  # 下一页  # 上一页  # 当前页  # 末页  # 每页  # 条数  # 首页  # 自定义  # 第一页  # 都是  # 能为  # 用在  # 写在  # 大家多多  # 计算出  # 后页  # 完成了  # 上步  # 目录下 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Angular 表单中正确绑定输入值以确保提交与验证正常工作  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  如何在阿里云虚拟服务器快速搭建网站?  如何快速查询网站的真实建站时间?  百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭  LinuxCD持续部署教程_自动发布与回滚机制  如何在宝塔面板创建新站点?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  iOS发送验证码倒计时应用  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  如何快速登录WAP自助建站平台?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  网站制作免费,什么网站能看正片电影?  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  常州企业网站制作公司,全国继续教育网怎么登录?  黑客如何利用漏洞与弱口令入侵网站服务器?  python中快速进行多个字符替换的方法小结  EditPlus中的正则表达式 实战(4)  Laravel API资源类怎么用_Laravel API Resource数据转换  Android实现代码画虚线边框背景效果  googleplay官方入口在哪里_Google Play官方商店快速入口指南  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  Android 常见的图片加载框架详细介绍  JavaScript常见的五种数组去重的方式  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  实例解析angularjs的filter过滤器  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel如何实现用户密码重置功能?(完整流程代码)  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  jQuery 常见小例汇总  深圳网站制作平台,深圳市做网站好的公司有哪些?  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  Laravel如何与Pusher实现实时通信?(WebSocket示例)  详解MySQL数据库的安装与密码配置  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  新三国志曹操传主线渭水交兵攻略  js代码实现下拉菜单【推荐】  如何在 Pandas 中基于一列条件计算另一列的分组均值  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】