分页组件的实现:

  1. class Pagination(object):
  2. """
  3. 自定义分页
  4. """
  5. def __init__(self,current_page,total_count,base_url,params,per_page_count=10,max_pager_count=11):
  6. try:
  7. current_page = int(current_page)
  8. except Exception as e:
  9. current_page = 1
  10. if current_page <=0:
  11. current_page = 1
  12. self.current_page = current_page
  13. # 数据总条数
  14. self.total_count = total_count
  15.  
  16. # 每页显示10条数据
  17. self.per_page_count = per_page_count
  18.  
  19. # 页面上应该显示的最大页码
  20. max_page_num, div = divmod(total_count, per_page_count)
  21. if div:
  22. max_page_num += 1
  23. self.max_page_num = max_page_num
  24.  
  25. # 页面上默认显示11个页码(当前页在中间)
  26. self.max_pager_count = max_pager_count
  27. self.half_max_pager_count = int((max_pager_count - 1) / 2)
  28.  
  29. # URL前缀
  30. self.base_url = base_url
  31.  
  32. # request.GET
  33. import copy
  34. params = copy.deepcopy(params)
  35. params._mutable = True
  36. # 包含当前列表页面所有的搜索条件
  37. # {source:[2,], status:[2], gender:[2],consultant:[1],page:[1]}
  38. # self.params[page] = 8
  39. # self.params.urlencode()
  40. # source=2&status=2&gender=2&consultant=1&page=8
  41. # href="/hosts/?source=2&status=2&gender=2&consultant=1&page=8"
  42. # href="%s?%s" %(self.base_url,self.params.urlencode())
  43. self.params = params
  44.  
  45. @property 这个property 的作用是,在调用的时候不用加上括号,直接使用self.start即可
  46. def start(self):
  47. return (self.current_page - 1) * self.per_page_count
  48.  
  49. @property
  50. def end(self):
  51. return self.current_page * self.per_page_count
  52.  
  53. def page_html(self):
  54. # 如果总页数 <= 11
  55. if self.max_page_num <= self.max_pager_count:
  56. pager_start = 1
  57. pager_end = self.max_page_num
  58. # 如果总页数 > 11
  59. else:
  60. # 如果当前页 <= 5
  61. if self.current_page <= self.half_max_pager_count:
  62. pager_start = 1
  63. pager_end = self.max_pager_count
  64. else:
  65. # 当前页 + 5 > 总页码
  66. if (self.current_page + self.half_max_pager_count) > self.max_page_num:
  67. pager_end = self.max_page_num
  68. pager_start = self.max_page_num - self.max_pager_count + 1 #倒这数11个
  69. else:
  70. pager_start = self.current_page - self.half_max_pager_count
  71. pager_end = self.current_page + self.half_max_pager_count
  72.  
  73. page_html_list = []
  74. # {source:[2,], status:[2], gender:[2],consultant:[1],page:[1]}
  75. # 首页
  76. self.params['page'] = 1
  77. first_page = '<li><a href="%s?%s">首页</a></li>' % (self.base_url,self.params.urlencode(),)
  78. page_html_list.append(first_page)
  79.  
  80. # 上一页
  81. self.params["page"] = self.current_page - 1
  82. if self.params["page"] < 1:
  83. pervious_page = '<li class="disabled"><a href="%s?%s" aria-label="Previous">上一页</span></a></li>' % (
  84. self.base_url, self.params.urlencode())
  85. else:
  86. pervious_page = '<li><a href = "%s?%s" aria-label = "Previous" >上一页</span></a></li>' % (
  87. self.base_url, self.params.urlencode())
  88. page_html_list.append(pervious_page)
  89.  
  90. # 中间页码
  91. for i in range(pager_start, pager_end + 1):
  92. self.params['page'] = i
  93. if i == self.current_page:
  94. temp = '<li class="active"><a href="%s?%s">%s</a></li>' % (self.base_url,self.params.urlencode(), i,)
  95. else:
  96. temp = '<li><a href="%s?%s">%s</a></li>' % (self.base_url,self.params.urlencode(), i,)
  97. page_html_list.append(temp)
  98.  
  99. # 下一页
  100. self.params["page"] = self.current_page + 1
  101. if self.params["page"] > self.max_page_num:
  102. self.params["page"] = self.current_page
  103. next_page = '<li class="disabled"><a href = "%s?%s" aria-label = "Next">下一页</span></a></li >' % (
  104. self.base_url, self.params.urlencode())
  105. else:
  106. next_page = '<li><a href = "%s?%s" aria-label = "Next">下一页</span></a></li>' % (
  107. self.base_url, self.params.urlencode())
  108. page_html_list.append(next_page)
  109.  
  110. # 尾页
  111. self.params['page'] = self.max_page_num
  112. last_page = '<li><a href="%s?%s">尾页</a></li>' % (self.base_url, self.params.urlencode(),)
  113. page_html_list.append(last_page)
  114.  
  115. return ''.join(page_html_list)

分页组件的使用

  1. """
  2. 自定义分页组件的使用方法:
  3. pager_obj = Pagination(request.GET.get('page',1),len(HOST_LIST),request.path_info,request.GET)
  4. host_list = HOST_LIST[pager_obj.start:pager_obj.end]
  5. html = pager_obj.page_html() ----->这里返回的是page_html_list
  6. return render(request,'hosts.html',{'host_list':host_list,"page_html":html})
  7. """

按照上面我们在前端之间传入数据到py文件中

  1. pager_obj = Pagination(request.GET.get('page',1),len(HOST_LIST),request.path_info,request.GET)
  1. request.GET.get('page',1) ------》 current_page
  1. len(HOST_LIST)         ------》 total_count(这里要是数据库的话,我们可以取总条数)
  1. request.path_info ------》 base_Url
  1. request.GET           ------》  params        

原文章转自:

http://www.cnblogs.com/haiyan123/p/8065353.html

Python分页组件的更多相关文章

  1. Python自定义分页组件

    为了防止XSS即跨站脚本攻击,需要加上 safe # 路由 from django.conf.urls import url from django.contrib import admin from ...

  2. 基于 Python 的自定义分页组件

    基于 Python 的自定义分页组件 分页是网页中经常用到的地方,所以将分页功能分出来,作为一个组件可以方便地使用. 分页实际上就是不同的 url ,通过这些 url 获取不同的数据. 业务逻辑简介 ...

  3. python web 分页组件

    闲来无事便写了一个易使用,易移植的Python Web分页组件.使用的技术栈是Python.Django.Bootstrap. 既然是易使用.易移植的组件,首先介绍一下其在django框架中的调用方式 ...

  4. Django 分页组件替换自定义分页

    Django的分页器(paginator) 总之不太好用我们还是用自己的好一些 自定义分页器 分页实现源码 """ 自定义分页组件 """ ...

  5. 前后端分离djangorestframework——分页组件

    Pagination 为什么要分页也不用多说了,大家都懂,DRF也自带了分页组件 这次用  前后端分离djangorestframework——序列化与反序列化数据  文章里用到的数据,数据库用的my ...

  6. 比Django官方实现更好的分页组件+Bootstrap整合

    前言 Django全家桶自带的分页组件只能说能满足分页这个功能,但是没那么好用就是了 Django的分页效果 django-pure-pagination分页效果 使用方法 首先安装: pip ins ...

  7. 基于Vue.js的表格分页组件

    有一段时间没更新文章了,主要是因为自己一直在忙着学习新的东西而忘记分享了,实在惭愧. 这不,大半夜发文更一篇文章,分享一个自己编写的一个Vue的小组件,名叫BootPage. 不了解Vue.js的童鞋 ...

  8. angular-ui分页组件

    http://angular-ui.github.io/bootstrap/#/pagination 分页组件只提供生成分页按钮,数据的显示需要使用ng-repeat, 注意设置 items-per- ...

  9. asp.net mvc4+mysql做一个简单分页组件(部分视图)

    在开始做mysql分页功能组件前,便设定的是要有一定可复用性.先在项目里Views文件夹下右键新建名为_PaginationComponent.cshtml,这里html及css我采用的bootstr ...

随机推荐

  1. 学习笔记——在vue中如何配置Jest(一)

    最近在搞Jest单元测试,如何在vue中安装和使用jest我就不说了,前一篇文章简单的说了一下在使用jest时遇到的一些问题,但是我觉得并没有真正的解决的很好.后面会在学习过程中更新前面的那篇文章,加 ...

  2. STRING DELIMITED BY SIZE

    The following COBOL program depicts the use of  STRING DELIMITED BY SIZE                 IDENTIFICAT ...

  3. JAVA中handleEvent和action的区别

    看代码中用到了handleEvent和action,都是对事件进行处理的,觉得这两个方法可以直接合并,于是尝试合并后,发现功能还是有问题,说明两者还是有区别了,查了很久的资料,才基本了解这两者的区别. ...

  4. linux 学习笔记四

    文件权限管理篇章 chown  -R mysql.  /usr/local 把 /usr/local/以及以下的所有文件和子目录属主改为  mysql ls -al * 用这条命令查询 chgrp c ...

  5. DOCKER 是什么?!

    Docker,改变程序世界的箱子 给产品经理讲技术 • 2016-01-14 • 深氪 Docker的道理和集装箱一样. 本文来自微信公众号“给产品经理讲技术”(pm_teacher),欢迎大家关注. ...

  6. Intellij IDEA更改项目优先编译顺序

    今天启动公司项目突然发现了一个问题,类里面明明有这个方法,但是无论怎样都不编译.(由于公司项目是二次开发,代码都是第三方写的,代码请勿仔细看,怕伤了你的眼睛.) 如图,找不到setJGMC方法. 但是 ...

  7. ES搜索社区

    好问题 1.比如我要索引的条目为“33分钟侦探”,我想在用户输入“3”.“33”.“三三”.“三十三”.“三十三分钟”等的情况下都命中该条目,请问有没有什么好的方式实现? PS:使用的是ansj分词器 ...

  8. php curl函数采集网页出现gzip压缩、编码不同导致的乱码 图文解决方法

    方法一: header("content-type:text/html;charset=utf-8");$url="http://115.47.116.10/rest/k ...

  9. 关于数据ajax请求

    默认设置下,所有请求均为异步请求.如果需要发送同步请求,请将此选项设置为 false.注意,同步请求将锁住浏览器,用户其它操作必须等待请求完成才可以执行. var temp; $.ajax({ asy ...

  10. VueJs初步学习,一个表格的增删改查

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...