Django中分页

py文件代码

  1. """
  2. 自定义分页组件
  3. 可以返回分页的数据和分页的HTML代码
  4. """
  5. from django.http import QueryDict
  6. class Pagination(object):
  7. def __init__(self, current_page, total_count, url_prefix, query_dict=QueryDict(mutable=True), per_page=10,
  8. show_page=9):
  9. """
  10. 初始化分分页器
  11. :param url_prefix: a标签的URL前缀
  12. :param current_page: 当前页码数
  13. :param total_count: 数据总数
  14. :param query_dict: 空的QueryDict()对象,并且是可修改的
  15. :param per_page: 每一页显示多少数据, 默认值是10
  16. :param show_page: 页面显示的页码数, 默认值是9
  17. """
  18. # 0.分页的URL前缀
  19. self.url_prefix = url_prefix
  20. self.query_dict = query_dict
  21. # 1. 每一页显示10条数据
  22. self.per_page = per_page
  23. assert per_page > 0
  24. # 2. 计算需要多少页
  25. total_page, more = divmod(total_count, per_page)
  26. if more:
  27. total_page += 1
  28. self.total_page = total_page
  29. # 3. 当前页码
  30. try:
  31. current_page = int(current_page)
  32. except Exception as e:
  33. current_page = 1
  34. current_page = total_page if current_page > total_page else current_page
  35. # 页码必须是大于0的数
  36. if current_page < 1:
  37. current_page = 1
  38. self.current_page = current_page
  39. # 4. 页面最多显示的页码数
  40. self.show_page = show_page
  41. # 5. 最多显示页码的一半
  42. self.half_show_page = self.show_page // 2
  43. @property
  44. def start(self):
  45. # 数据切片的开始位置
  46. return self.per_page * (self.current_page - 1)
  47. @property
  48. def end(self):
  49. # 数据切片的结束为止
  50. return self.current_page * self.per_page
  51. # 定义一个返回HTML代码的方法
  52. def page_html(self):
  53. # 如果总页码数小于最大要显示的页码数
  54. if self.total_page < self.show_page:
  55. show_page_start = 1
  56. show_page_end = self.total_page
  57. # 左边越界
  58. elif self.current_page - self.half_show_page < 1:
  59. show_page_start = 1
  60. show_page_end = self.show_page
  61. # 右边越界
  62. elif self.current_page + self.half_show_page > self.total_page:
  63. show_page_end = self.total_page
  64. show_page_start = self.total_page - self.show_page + 1
  65. else:
  66. show_page_start = self.current_page - self.half_show_page
  67. # 页面显示页码的结束
  68. show_page_end = self.current_page + self.half_show_page
  69. # 生成分页的HTML代码
  70. page_list = []
  71. # 添加分页代码的前缀
  72. page_list.append('<nav aria-label="Page navigation"><ul class="pagination">')
  73. # 添加首页
  74. self.query_dict['page'] = 1
  75. page_list.append(f'<li><a href="{self.url_prefix}?{self.query_dict.urlencode()}">首页</a></li>')
  76. # 添加上一页
  77. if self.current_page - 1 < 1: # 已经到头啦,不让点上一页啦
  78. page_list.append(
  79. '<li class="disabled"><a href="" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>')
  80. else:
  81. self.query_dict['page'] = self.current_page - 1
  82. page_list.append(
  83. f'<li><a href="{self.url_prefix}?{self.query_dict.urlencode()}" aria-label="Previous">'
  84. f'<span aria-hidden="true">&laquo;</span></a></li>'
  85. )
  86. for i in range(show_page_start, show_page_end + 1):
  87. self.query_dict['page'] = i
  88. if i == self.current_page:
  89. s = f'<li class="active"><a href="{self.url_prefix}?{self.query_dict.urlencode()}">{i}</a></li>'
  90. else:
  91. s = f'<li><a href="{self.url_prefix}?{self.query_dict.urlencode()}">{i}</a></li>'
  92. page_list.append(s)
  93. # 添加下一页
  94. if self.current_page + 1 > self.total_page:
  95. page_list.append(
  96. '<li class="disabled"><a href="" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>')
  97. else:
  98. self.query_dict['page'] = self.current_page + 1
  99. page_list.append(
  100. f'<li><a href="{self.url_prefix}?{self.query_dict.urlencode()}" aria-label="Next">'
  101. f'<span aria-hidden="true">&raquo;</span></a></li>'
  102. )
  103. # 添加尾页
  104. self.query_dict['page'] = self.total_page
  105. page_list.append(f'<li><a href="{self.url_prefix}?{self.query_dict.urlencode()}">尾页</a></li>')
  106. # 添加分页代码的后缀
  107. page_list.append('</ul></nav>')
  108. page_html = ''.join(page_list)
  109. return page_html

实例化对象

    1. def dashboard(request):
    2. # 获取当前网页路径
    3. url_prefix = request.path_info
    4. # 获取当前页码数
    5. current_page = request.GET.get('page', 1)
    6. # 获取所有客户的信息
    7. customer_list = Customer.objects.all()
    8. # 实例分页代码
    9. pagination = Pagination(current_page=current_page, total_count=customer_list.count(), url_prefix=url_prefix, per_page=8)
    10. # 获取当前页的数据
    11. data = customer_list[pagination.start:pagination.end]
    12. page_html = pagination.page_html()
    13. return render(request, "Dashboard.html", {'customer_list': data, "page_html": page_html})

前端代码

    1. <div>
    2. {{ page_html|safe }}
    3. </div>

使用django脚本去创建数据

  1. 批量创建数据

    1. 使用Django脚本去创建数据
    2. bulk_create()
  2. 分页
    1. 纯Python基础写的,
    2. django里面获取当前url
      1. request.path_info 获取当前路径
      2. request.get_full_path 获取全路径

实际样式

django之分页,纯python代码的更多相关文章

  1. pngCanvas 是一个使用纯Python代码的生成png图像的工具

    #!/usr/bin/env python """Simple PNG Canvas for Python - updated for bytearray()" ...

  2. 深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!

    本文参考:http://www.dabeaz.com/coroutines/   作者:David Beazley 缘起: 本人最近在学习python的协程.偶然发现了David Beazley的co ...

  3. 涨见识了,在终端执行 Python 代码的 6 种方式!

    原作:BRETT CANNON 译者:豌豆花下猫@Python猫 英文:https://snarky.ca/the-many-ways-to-pass-code-to-python-from-the- ...

  4. Python Django的分页,Form验证,中间件

    本节内容 Django的分页 Form 中间件 1 Django 分页 1.1 Django自带的分页 1.首先来看下我的测试数据环境 ############ models.py ######### ...

  5. python代码自动补全配置及Django入门Demo

    django入门代码示例小博客:https://pan.baidu.com/s/1pLjLPSv 1.自动补全功能 许多人都知道 iPython 有很好的自动补全能力,但是就未必知道 python 也 ...

  6. Django 实现分页功能(django 2.2.7 python 3.7.5 )

    Django 自带名为 Paginator 的分页工具, 方便我们实现分页功能.本文就讲解如何使用 Paginator 实现分页功能. 一. Paginator Paginator 类的作用是将我们需 ...

  7. python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...

  8. Python代码样例列表

    扫描左上角二维码,关注公众账号 数字货币量化投资,回复“1279”,获取以下600个Python经典例子源码 ├─algorithm│       Python用户推荐系统曼哈顿算法实现.py│    ...

  9. Python代码混淆和加密技术

    Python进行商业开发时, 需要有一定的安全意识, 为了不被轻易的逆向. 混淆和加密就有所必要了. 为了增加代码阅读的难度, 源代码的混淆非常必要, 一个在线的Python代码混淆网站. http: ...

随机推荐

  1. php使用CURL实现GET和POST方式请求

    CURL请求,支持GET和POST两种方式,默认为GET方式,如果传第二个参数则为POST方式请求,设置了超时时间,避免程序卡死. /** 使用curl方式实现get或post请求 @param $u ...

  2. 基于nodejs的阿里云DDNS服务,支持多网卡绑定

    前段几天写的,自用. 想着也许有和我一样需求的同学,所以开源发出来了. 提供阿里云的DDNS设置,支持多网卡多域名绑定. 特性 支持阿里云DDNS设置 支持针对多个线路多个网卡单独设置域名 支持IPv ...

  3. const 和指针之间的姻缘

    const和指针到底有何姻缘呢? char const *p = NULL; //char const 和 const char 是一样的,p 是一个指向常整型的指针变量 ,指针变量的值不能改变 ch ...

  4. HttpClient的使用(get、post请求)

    添加pom依赖 <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient --> <d ...

  5. 国内外主流5款doshboard软件比较和对比

    大数据行业随着互联网的蓬勃发展中也越来越被人们看好,但是从事大数据行业的数据分析师经常会谈到dashboard,很多人就会疑惑什么是dashboard,下面就来了解一下Doshboard的发展. da ...

  6. Google发布跨云Serverless管理平台Knative

    企业只要使用由Google与Pivotal.IBM.红帽和SAP等企业共同开发的跨云Serverless管理平台Knative,就能在支持Kubernetes的云平台上自由的迁移工作负载,无论是跨私有 ...

  7. C#调用带参数的python脚本

    问题描述:使用C#调用下面的带参数的用python写的方法,并且想要获取返回值. def Quadratic_Equations(a,b,c): D=b**2-4*a*c ans=[] ans.app ...

  8. Spring 5 , 狭义上的spring 以及 广义上的spring , spring 设计模式

    Spring 5 距离 Spring4 发布有4年多, 所以说Spring 5是一个重要的版本 要构建和运行Spring 5应用程序, 至少需要Java EE 7 和JDK 8 , 之前的JDK和Ja ...

  9. 安装Android studio 并成功运行

    之前是在idea上弄得发现有些问题就下载了Android studio教程(4条消息) Android Studio安装及环境配置教程_xuw_xy的博客-CSDN博客_androidstudio安装 ...

  10. SQL:查询时给表起别名

    Q 有两个表student.score,查询前一个表的id.name列,后一个表的total列,查询结果通过两个表的id连接起来 要求 使用别名st和sc替换表名进行查询 A SELECT st.id ...