分页组件

一、分页的实现与使用

  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. leetcode 113 path Sum II 路径和

    递归先序遍历+vector<int>容器记录路径 /** * Definition for a binary tree node. * struct TreeNode { * int va ...

  2. 代码测试:unsigned char*图像数据转换成OpenCV中Mat类型

    直接使用Mat的构造函数,把指针的位置赋给下面中的data就OK了: Mat(int rows, int cols, int type, void* data, size_t step=AUTO_ST ...

  3. 移动端自动化==>Windows-Android-Appium环境搭建

    第一步 安装JDK,本机如果带有1.7及以上版本且配置好了环境变量,则可忽略此安装步骤. JDK的安装包,百度下载即可.安装完成后配置环境变量. cmd下验证环境变量是否配置成功 第二步 安装Andr ...

  4. CentOS7 yum报 Cannot retrieve metalink for repository: epel/x86_64. Please verify its path解决方法

    打开/etc/yum.repos.d/epel.repo,将 [epel] name=Extra Packages for Enterprise Linux 6 – $basearch baseurl ...

  5. JavaScript —— 实现简单计算器【带有 开/关机 清零 退格 功能】

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  6. Scratch少儿编程系列:(八)演奏简单音乐

    一.程序说明 本程序,用来演奏简单音乐. 二.制作过程 1. 场景和角色的选择 场景选择“音乐和舞蹈”主题下的“party root”,角色沿用默认角色,如下图: 选择后效果如下图: 2. 切换到“脚 ...

  7. 修改了Ubuntu下的/usr目录权限,导致不能使用sudo命令的修复-----转载

    刚开始运行sudo时,报了下面这个错误 sudo: must be setuid root,于是上网找解决方法,搜索出来的都是这样解决的 ls -l  /usr/bin/sudochown root: ...

  8. MySQL学习-数据库设计以及sql的进阶语句

    1.数据库设计 关系型数据库建议在E-R模型的基础上,我们需要根据产品经理的设计策划,抽取出来模型与关系,制定出表结构,这是项目开始的第一步 在开发中有很多设计数据库的软件,常用的如power des ...

  9. python调用java所有代码都要放在jvm开启的时候调用,否则报错: No matching overloads found for in find. at native\common\jp_method.cpp:127

    1.解决方法 开启java虚拟机 jvm 或者先执行结束在关闭java虚拟机jvm

  10. 安装Git并关联

    下载git 打开git bash 生成key将 key绑定到帐号 输入命令 ssh-keygen -t rsa -C 'LoginName' 根据命令生成的地址找到对应文件复制密钥 打开github登 ...