Django分页类的封装

Django ORM 

封装

之前有提到(Django分页的实现)会多次用到分页,将分页功能封装起来能极大提高效率。

其实不是很难,就是将之前实现的代码全都放到类中,将需要用到的参数,比如,page_num, total_count, url_prefix, per_page, max_page,以参数的形式传到类中进行初始化,而后的实现代码即可用 self.变量名 的形式使用自己分页类内部的变量。

Page 类

  1. class myPage():
  2. def __init__(self, page_num, total_count, url_prefix, per_page=10, max_page=11):
  3. """
  4. :param page_num: 当前页码数
  5. :param total_count: 数据总数
  6. :param url_prefix: a标签href的前缀
  7. :param per_page: 每页显示多少条数据
  8. :param max_page: 页面上最多显示几个页码
  9. """
  10. self.url_prefix = url_prefix
  11. self.max_page = max_page
  12. self.per_page = per_page
  13. total_page, m = divmod(total_count, per_page)
  14. if m > 0:
  15. total_page += 1
  16. self.total_page = total_page
  17. try:
  18. page_num = int(page_num)
  19. # 如果输入页码数过大,默认跳到最后一页
  20. if page_num > total_page:
  21. page_num = total_page
  22. except Exception as e:
  23. page_num = 1
  24. self.page_num = page_num
  25. self.data_start = (page_num - 1) * 10
  26. self.data_end = page_num * 10
  27. # 1. 先实现一半一半
  28. max_page = 11
  29. # 10. 如果数据量少,页数也少
  30. if total_page < max_page:
  31. self.max_page = total_page
  32. half_max_page = max_page // 2
  33. page_start = page_num - half_max_page
  34. page_end = page_num + half_max_page
  35. # 2. 特殊情况一:页码前面出现负值
  36. if page_start < 1:
  37. page_start = 1
  38. page_end = self.max_page
  39. # 3. 特殊情况二:页码后面出现空白页
  40. if page_end >= total_page:
  41. page_start = total_page - self.max_page + 1
  42. page_end = total_page
  43. self.page_start = page_start
  44. self.page_end = page_end
  45. @property
  46. def start(self):
  47. return self.data_start
  48. @property
  49. def end(self):
  50. return self.data_end
  51. def page_html(self):
  52. page_html_list = []
  53. # 9. 解决在首页处点前一页
  54. if self.page_num == 1:
  55. page_html_list.append(
  56. '<li class="disabled"><a href="#"><span aria-hidden="true">&laquo;</span></a></li>')
  57. else:
  58. page_html_list.append(
  59. '<li><a href="{0}?pages={1}"><span aria-hidden="true">&laquo;</span></a></li>'.format(self.url_prefix,
  60. self.page_num - 1))
  61. # 4. 加上首页
  62. page_html_list.append('<li><a href="{}?pages=1">首页</a></li>'.format(self.url_prefix))
  63. for i in range(self.page_start, self.page_end + 1):
  64. # 11. 对当前页加上活动active样式类
  65. if i == self.page_num:
  66. temp = '<li class="active"><a href="{0}?pages={1}">{1}</a></li>'.format(self.url_prefix, i)
  67. else:
  68. temp = '<li><a href="{0}?pages={1}">{1}</a></li>'.format(self.url_prefix, i)
  69. page_html_list.append(temp)
  70. # 5. 加上尾页
  71. page_html_list.append('<li><a href="{0}?pages={1}">尾页</a></li>'.format(self.url_prefix, self.total_page))
  72. # 8. 解决最后一页时点后一页
  73. if self.page_num == self.total_page:
  74. page_html_list.append(
  75. '<li class="disabled"><a href="#" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>')
  76. else:
  77. page_html_list.append(
  78. '<li><a href="{0}?pages={1}" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>'.format(
  79. self.url_prefix,
  80. self.page_num + 1))
  81. # 转成字符串
  82. page_html = "".join(page_html_list)
  83. return page_html

前端模板代码

前端模板代码没有什么改变

  1. <div class="container">
  2. <table class="table table-bordered">
  3. <thead>
  4. <tr>
  5. <th>序号</th>
  6. <th>id</th>
  7. <th>部门名称</th>
  8. </tr>
  9. </thead>
  10. <tbody>
  11. {% for dept in depts %}
  12. <tr>
  13. <td>{{ forloop.counter }}</td>
  14. <td>{{ dept.id }}</td>
  15. <td>{{ dept.name }}</td>
  16. </tr>
  17. {% endfor %}
  18. </tbody>
  19. </table>
  20. <nav aria-label="Page navigation">
  21. <ul class="pagination">
  22. {{ page_html|safe }}
  23. </ul>
  24. </nav>
  25. </div>

views 中的代码

只需要实例化分页类就能实现分页操作,与之前的方法相比,代码量减少了不少。

  1. def depts(request):
  2. # 从相应模块中导入分页类
  3. from utils.myPage import myPage
  4. all_depts = models.Dept2.objects.all()
  5. page_num = request.GET.get("pages")
  6. total_num = models.Dept2.objects.all().count()
  7. # 实例化分页类
  8. page_obj = myPage(page_num, total_num, '/depts/', per_page=10, max_page=11)
  9. # 通过实例的变量从数据库中取出需要展示的数据
  10. ret = models.Dept2.objects.all()[page_obj.start:page_obj.end]
  11. # 由实例调用函数生成需要的HTML代码
  12. dept_page_html = page_obj.page_html()
  13. return render(request, "depts.html", {"depts": ret, "page_html": dept_page_html})

效果图

GitHub地址:https://github.com/protea-ban/oldboy/tree/master/s9day71/ormday71

Django分页类的封装的更多相关文章

  1. 自定义MVC框架之工具类-分页类的封装

    以前写过一个MVC框架,封装的有点low,经过一段时间的沉淀,打算重新改造下,之前这篇文章封装过一个验证码类. 这次重新改造MVC有几个很大的收获 >全部代码都是用Ubuntu+Vim编写,以前 ...

  2. php 之 分页查询的使用方法及其类的封装

    一.分页的使用: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...

  3. Django 自定义分页类

    分页类代码: class Page(object): ''' 自定义分页类 可以实现Django ORM数据的的分页展示 输出HTML代码: 使用说明: from utils import mypag ...

  4. Django 实现的分页类

    后台实现的一个分页类: from django.utils.safestring import mark_safe class Page: def __init__(self, current_pag ...

  5. php四个常用类封装 :MySQL类、 分页类、缩略图类、上传类;;分页例子;

    Mysql类 <?php /** * Mysql类 */ class Mysql{ private static $link = null;//数据库连接 /** * 私有的构造方法 */ pr ...

  6. django 分页(2) 使用类 页码显示

    django 分页显示页码 views.py 显示11页码 ) < 起始位置 - 10总页数 else 总页数 > IF 当前页 小于 起始位置 结束页 IF 当前页 大于 IF 如果结束 ...

  7. 封装好的PHP分页类,简单好用--在开源看到的,取回来自己用

    class Pagination  独立分页类 调用方式: $pagenation = new Pagination( 4, 10, 200 ); // 4(第一个参数) = currentPage, ...

  8. django 分页组件

      一.仿django分页功能自己实现 urls.py 1 2 3 4 5 6 7 8 9 from django.conf.urls import url from django.contrib i ...

  9. Django分页的实现

    Django分页的实现 Django ORM  分页介绍 分页是网页浏览中常见到的一种形式,在数据量较大时,一个页面显示不全,采取分割数据由用户选择进行显示的方式. 基本实现 技术点 通过切片得到数据 ...

随机推荐

  1. setitemdata 32位 or 64位

    我用SetItemData 和GetItemData把数据库一条数据导入到CListctrl 32位下 程序都可以跑 GetItemData能得到自定义类数据 可以64位得不到?

  2. jquery从零开始学----选择器

     (2011-01-10 21:21:28) 转载▼ 后代选择器: $("mix mix"),当然可以是多个嵌套,但后代选择器可以是深层子代,所以$("mix mix m ...

  3. WebAPI请求(转)

    出处:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...

  4. spark yarn 集群提交kafka代码

    配置好hadoop的环境,具体根据http://blog.csdn.net/u010638969/article/details/51283216博客所写的进行配置. 运行start-dfs.sh启动 ...

  5. Web挖掘

    Web挖掘 Web挖掘的目标是从Web的超链接.网页内容和使用日志中探寻有用的信息.依据Web挖掘任务,可以划分为三种主要类型:Web结构挖掘.Web内容挖掘和Web使用挖掘.Web结构挖掘简单的说就 ...

  6. Linux(一) - Unix&Linux 历史

    Unix Unix 的诞生 Unix的历史可以追溯到20世纪60年代中期,当时麻省理工学院,AT&T,贝尔实验室和通用电气公司联合开发了一种名为Multics的操作系统,Multics 中存在 ...

  7. String调用Array相关方法——有点古怪

    这个系列的前面几篇文章中有谈到在一个Object上使用apply.call等方法操作另一个Object的方法,今天我们来学习怎么样在String上调用Array相关方法. 在许多方面,字符串表现的好像 ...

  8. 10-12Linux流编程的一些知识点

    第五章  Linux 的流编程 Linux流操作基础      流和文件的关系:流相当于一个缓冲区,可以将文件描述符和流关联,获得相应的缓冲区,以此来提高系统对磁盘的存取速度.     流的结构和操作 ...

  9. ADO.NET批量添加数据到SQL Server—BulkCopy使用指南

    BulkCopy位于System.Data.SqlClient命名空间,允许你使用其他源的数据有效地批量加载 SQL Server 表. 属性: BatchSize :每个批处理中的行数. 在每个批处 ...

  10. Beginning Asp.Net Security 读书笔记-----XSS

    几个月前通过Veracode对代码进行动态和静态安全扫描,扫出了数以千计的安全bug,基本上都是top 10的,安全漏洞. 其中CWE80,CWE601数量最多.具体CWE的定义可参考http://c ...