分页组件

一、分页的实现与使用

  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
  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. self.params["page"] = self.current_page - 1
  81. if self.params["page"] < 1:
  82. pervious_page = '<li class="disabled"><a href="%s?%s" aria-label="Previous">上一页</span></a></li>' % (
  83. self.base_url, self.params.urlencode())
  84. else:
  85. pervious_page = '<li><a href = "%s?%s" aria-label = "Previous" >上一页</span></a></li>' % (
  86. self.base_url, self.params.urlencode())
  87. page_html_list.append(pervious_page)
  88. # 中间页码
  89. for i in range(pager_start, pager_end + 1):
  90. self.params['page'] = i
  91. if i == self.current_page:
  92. temp = '<li class="active"><a href="%s?%s">%s</a></li>' % (self.base_url,self.params.urlencode(), i,)
  93. else:
  94. temp = '<li><a href="%s?%s">%s</a></li>' % (self.base_url,self.params.urlencode(), i,)
  95. page_html_list.append(temp)
  96.  
  97. # 下一页
  98. self.params["page"] = self.current_page + 1
  99. if self.params["page"] > self.max_page_num:
  100. self.params["page"] = self.current_page
  101. next_page = '<li class="disabled"><a href = "%s?%s" aria-label = "Next">下一页</span></a></li >' % (
  102. self.base_url, self.params.urlencode())
  103. else:
  104. next_page = '<li><a href = "%s?%s" aria-label = "Next">下一页</span></a></li>' % (
  105. self.base_url, self.params.urlencode())
  106. page_html_list.append(next_page)
  107.  
  108. # 尾页
  109. self.params['page'] = self.max_page_num
  110. last_page = '<li><a href="%s?%s">尾页</a></li>' % (self.base_url, self.params.urlencode(),)
  111. page_html_list.append(last_page)
  112.  
  113. 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()
  6. return render(request,'hosts.html',{'host_list':host_list,"page_html":html})
  7. """

三、批量查数据

  1. #批量创建数据
  2. # booklist = []
  3. # for i in range(100):
  4. # booklist.append(models.Book(name="book" + str(i), price=20 + i * i))
  5. #
  6. # models.Book.objects.bulk_create(booklist)

Django【第11篇】:Django之分页升级版本(组件)的更多相关文章

  1. Django框架第九篇--Django和Ajax、序列化组件(serializers)、自定义分页器、模型表choice参数

    Django和Ajax 一.什么是Ajax AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步的Javascript和XML”.即使用Javascript语 ...

  2. Django基础-04篇 Django开发前后端联动

    1. 写views views.py代码块 1.在前端以/article/{{ article.id }}这种方式请求后台, 参数配置在urls.py中path('category/<int:i ...

  3. Django基础06篇 分页

    1.导入Django自带的分页类 from django.core.paginator import Paginator 2.分页类的使用 def index(request): # return H ...

  4. Python之路【第十七篇】:Django【进阶篇 】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

  5. Python之路【第十七篇】:Django【进阶篇】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

  6. Django【进阶篇】

    目录 一.Model 二.admin 三.Form组件 四.Cookie 五.Session 六.分页 七.序列化 一.Model 数据库的配置 1.django默认支持sqlite,mysql, o ...

  7. Django【进阶篇 】

    Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...

  8. Python之路【第十六篇】:Django【基础篇】

    Python之路[第十六篇]:Django[基础篇]   Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...

  9. Python之Django【进阶篇 】

    Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...

随机推荐

  1. kafka window安装与配置

    一.安装jdk1.8(此处省略) 二.安装zookeeper1. 下载安装包:http://zookeeper.apache.org/releases.html,解压到指定目录(如下) 2. 在系统变 ...

  2. CSS-W3School:CSS table-layout 属性

    ylbtech-CSS-W3School:CSS table-layout 属性 1.返回顶部 1. CSS table-layout 属性 CSS 参考手册 实例 设置表格布局算法: table { ...

  3. JS获取select被选中的option的值

    一:JavaScript原生的方法 1:拿到select对象: var myselect=document.getElementById(“test”); 2:拿到选中项的索引:var index=m ...

  4. Mac使用SSH连接远程服务器

    1. 终端通过 ssh 连接远程服务器 ssh -p 36622 root@localhost 2. 文件上传下载 上传 scp 下载 scp 3. 客户端 FinalShell(推荐) FileZi ...

  5. ifram刷新父窗口中内嵌页面

    如果C的iframe标签的id是"iframec",那么在B.aspx中你想刷新的代码处写 parent.document.getElementById('iframec').sr ...

  6. nginx实现域名跳转

    server { listen 80; server_name www.dd.com www.tt.com; index index.html index.htm index.php; root /u ...

  7. windows 10 取消alt+tab的预览功能

    1.win+r  输入regedit打开注册表编辑器 2.HKEY_CURRENT_USER/SOFTWARE/Microsoft/Windows/CurrentVersion/Explorer 3. ...

  8. cocos2dx基础篇(8) 开关按钮CCControlSwitch

    [3.x] (1)去掉 “CC” (2)对象类 CCObject 改为 Ref (3)标签类 LabelTTF 改为 Label (4)CCControlEvent 改为强枚举 Control::Ev ...

  9. LeetCode.860-卖柠檬水找零(Lemonade Change)

    这是悦乐书的第331次更新,第355篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第201题(顺位题号是860).在柠檬水摊上,每杯柠檬水的价格为5美元.客户站在队列中向 ...

  10. 使用itchat完成微信自动回复

    import itchat from itchat.content import * # 微信自动回复 @itchat.msg_register([TEXT]) def text_reply(msg) ...