Django自定义分页效果


Posted in Python onJune 27, 2017

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

确定分页需求:

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

效果图:

Django自定义分页效果

首先,利用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的分页功能自定义分页模块,可以应用在不同的业务页面上。

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

Python 相关文章推荐
编写简单的Python程序来判断文本的语种
Apr 07 Python
Python分治法定义与应用实例详解
Jul 28 Python
Python快速排序算法实例分析
Nov 29 Python
Go/Python/Erlang编程语言对比分析及示例代码
Apr 23 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
May 26 Python
Python Pandas 获取列匹配特定值的行的索引问题
Jul 01 Python
使用 Supervisor 监控 Python3 进程方式
Dec 05 Python
python自动脚本的pyautogui入门学习
Apr 01 Python
Python opencv相机标定实现原理及步骤详解
Apr 09 Python
python中列表的含义及用法
May 26 Python
Python os库常用操作代码汇总
Nov 03 Python
python中复数的共轭复数知识点总结
Dec 06 Python
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
Jun 27 #Python
最近Python有点火? 给你7个学习它的理由!
Jun 26 #Python
Python的装饰器使用详解
Jun 26 #Python
Python学习思维导图(必看篇)
Jun 26 #Python
python flask 多对多表查询功能
Jun 25 #Python
Python的语言类型(详解)
Jun 24 #Python
Python队列的定义与使用方法示例
Jun 24 #Python
You might like
PHP计数器的实现代码
2013/06/08 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
php分页查询的简单实现代码
2017/03/14 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
原生javaScript做得动态表格(注释写的很清楚)
2013/12/29 Javascript
asp.net+js实现金额格式化
2015/02/27 Javascript
javaScript基础语法介绍
2015/02/28 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
jQuery实现仿腾讯视频列表分页效果的方法
2015/08/07 Javascript
AngularJS 简单应用实例
2016/07/28 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
2016/08/20 Javascript
jquery实现左右滑动式轮播图
2017/03/02 Javascript
ES6新特性七:数组的扩充详解
2017/04/21 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
jQuery 实时保存页面动态添加的数据的示例
2017/08/14 jQuery
vue.js 获取select中的value实例
2018/03/01 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
详解操作虚拟dom模拟react视图渲染
2018/07/25 Javascript
vue2.0移动端滑动事件vue-touch的实例代码
2018/11/27 Javascript
如何在node环境实现“get数据解析”代码实例
2020/07/03 Javascript
使用Vue-cli 中为单独页面设置背景图片铺满全屏
2020/07/17 Javascript
Python生成随机验证码的两种方法
2015/12/22 Python
Flask框架的学习指南之用户登录管理
2016/11/20 Python
python实现二分查找算法
2017/09/21 Python
Python scipy的二维图像卷积运算与图像模糊处理操作示例
2019/09/06 Python
面向对象学习之pygame坦克大战
2019/09/11 Python
linux系统下pip升级报错的解决方法
2021/01/31 Python
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
Stührling手表官方网站:男女高品质时尚手表的领先零售商
2021/01/07 全球购物
一套Delphi的笔试题二
2013/05/11 面试题
《守株待兔》教学反思
2014/03/01 职场文书
幼儿园卫生保健制度
2015/08/05 职场文书
2016年习总书记讲话学习心得体会
2016/01/20 职场文书
python机器学习创建基于规则聊天机器人过程示例详解
2021/11/02 Python