本节内容

自定义一个简单的内置分页

Django内置分页

Django内置分页扩展(继承)

自定义内置组件


自定义一个简单的内置分页


先用django自己自定制一个简单的内置分页,大概掌握内置分页的底层原理之后,自己就可以扩展分页。

首先定义每页分页为10,每当用户GET访问 ?p=1 时或其他 只展示10 行数据

然后对原来的数据USER_LIST进行切片,按照用户GET访问定制的p为何值时展示start到end之间的索引值

这里使用了简单的数学公式 ,计算出start和end后再传给render渲染

  1.  
  1. USER_LIST = []for i in range(1,999): d = {"name":"root"+str(i),"age":i} USER_LIST.append(d)
  1.  
  2. def index(request):
  3. per_page_count = 10
  4. current_page= request.GET.get("p")
  5. current_page = int(current_page)
  6.  
  7. start = (current_page-1)*per_page_count
  8. end = current_page*per_page_count
  9.  
  10. return render(request,"index.html",{"USER_LIST":USER_LIST[start:end]})

Django内置分页

Paginator(L,10)第一个参数为传入的数据,第二个为每页显示的数据条数

Paginator下封装了许多方法,其中还封装了page对象,page对象下还封装了Paginator对象,可以让page对象再调用回来

  1. from django.shortcuts import render
  2. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  3.  
  4. L = []
  5. for i in range(999):
  6. L.append(i)
  7.  
  8. def index(request):
  9. current_page = request.GET.get('p')
  10.  
  11. paginator = Paginator(L, 10)
  12. # per_page: 每页显示条目数量
  13. # count: 数据总个数
  14. # num_pages:总页数
  15. # page_range:总页数的索引范围,如: (1,10),(1,200)
  16. # page: page对象
  17. try:
  18. posts = paginator.page(current_page) #对当前页进行切片
  19. # has_next 是否有下一页
  20. # next_page_number 下一页页码
  21. # has_previous 是否有上一页
  22. # previous_page_number 上一页页码
  23. # object_list 分页之后的数据列表
  24. # number 当前页
  25. # paginator Paginator对象
  26. except PageNotAnInteger:
  27. posts = paginator.page(1)
  28. except EmptyPage:
  29. posts = paginator.page(paginator.num_pages)
  30. return render(request, 'index.html', {'posts': posts})

Django内置分页扩展(继承)

我们来自定制一个功能:若总页数为100页时,让第11页中间显示   7,8,9,10,11,12,13,14,15


自定制一个CustomPaginator类继承Paginator类就可以自定制一个我们需要的分页组件

在CustomPaginator中我们定义了页数范围:定义页数范围首先分为两种情况

  • 总页数特别少时:总页数少于最多可用于显示的页数时——>直接显示总页数
  • 总页数特别多时:又分3种情况

总页数特别多时

当前页数处于1,2,3较排头的页数时,没必要让其居中显示——>直接显示 1---最大可用于显示的页数   (区间均为:最大可用于显示的页数)

当前页数特别大,处于排尾的页数,直接显示——>  总页数减去最大可用于显示的页数 ---总页数    (区间均为:最大可用于显示的页数)

当前页数处于中间部分——>当前页数减去最大可用于显示的页数的一半 --- 当前页数加上最大可用于显示的页数的一半   (区间均为:最大可用于显示的页数)

  1. class CustomPaginator(Paginator):
  2. def __init__(self, current_page, max_pager_num, *args, **kwargs):
  3. """
  4. :param current_page: 当前页
  5. :param max_pager_num:最多显示的页码个数
  6. :param args:
  7. :param kwargs:
  8. :return:
  9. """
  10. self.current_page = int(current_page)
  11. self.max_pager_num = max_pager_num
  12. super(CustomPaginator, self).__init__(*args, **kwargs)
  13. def page_num_range(self):
  14. # 当前页面
  15. # self.current_page
  16. # 总页数
  17. # self.num_pages
  18. # 最多显示的页码个数
  19. # self.max_pager_num
  20. print(1)     #当总页数少于最多可显示的页码个数时,就直接显示总页数就行
  21. if self.num_pages < self.max_pager_num:
  22. return range(1, self.num_pages + 1)
  23. print(2)     #以下是当前页数特别多的时候的情况
  24. part = int(self.max_pager_num / 2)     #当前页数特别小的时候,例如1,2,3。。小于每页可显示的最多页数的一半的时候
  25. if self.current_page - part < 1:
  26. return range(1, self.max_pager_num + 1)
  27. print(3)     #当前页数特别大的时候,接近总页数的时候
  28. if self.current_page + part > self.num_pages:
  29. return range(self.num_pages + 1 - self.max_pager_num, self.num_pages + 1)
  30. print(4)
  31. return range(self.current_page - part, self.current_page + part + 1)
  32. L = []
  33. for i in range(999):
  34. L.append(i)
  35. def index(request):
  36. current_page = request.GET.get('p')
  37. paginator = CustomPaginator(current_page, 11, L, 10)
  38. # per_page: 每页显示条目数量
  39. # count: 数据总个数
  40. # num_pages:总页数
  41. # page_range:总页数的索引范围,如: (1,10),(1,200)
  42. # page: page对象
  43. try:
  44. posts = paginator.page(current_page)
  45. # has_next 是否有下一页
  46. # next_page_number 下一页页码
  47. # has_previous 是否有上一页
  48. # previous_page_number 上一页页码
  49. # object_list 分页之后的数据列表
  50. # number 当前页
  51. # paginator paginator对象
  52. except PageNotAnInteger:
  53. posts = paginator.page(1)
  54. except EmptyPage:
  55. posts = paginator.page(paginator.num_pages)
  56. return render(request, 'index.html', {'posts': posts})

自定义内置组件

html用法 :{ page_obj.page_str|safe }}

  1. class Pagination(object):
  2. def __init__(self,totalCount,currentPage,perPageItemNum=30,maxPageNum=7):
  3. #数据总个数
  4. self.total_count = totalCount
  5.  
  6. #当前页
  7. try:
  8. v = int(currentPage)
  9. if v <= 0:
  10. self.current_page =1
  11. self.current_page = v
  12. except Exception as e:
  13. self.current_page = 1
  14.  
  15. #每页显示的数据数
  16. self.per_page_item_num = perPageItemNum
  17. self.max_page_num = maxPageNum
  18.  
  19. def start(self):
  20. return (self.current_page-1) * self.per_page_item_num
  21. def end(self):
  22. return self.current_page * self.per_page_item_num
  23.  
  24. @property
  25. def num_pages(self):
  26. """
  27. 总页数
  28. :return:
  29. """
  30. #数据总个数除于每页显示的行数,得商与余数
  31. a,b = divmod(self.total_count,self.per_page_item_num)
  32. if b==0:
  33. return a
  34. return a+1
  35.  
  36. def page_num_range(self):
  37. print(1)
  38. if self.num_pages < self.max_page_num:
  39. return range(1, self.num_pages + 1)
  40. print(2)
  41. part = int(self.max_page_num / 2)
  42. if self.current_page - part < 1:
  43. return range(1, self.max_page_num+ 1)
  44. print(3)
  45.  
  46. if self.current_page + part > self.num_pages:
  47. return range(self.num_pages + 1 - self.max_page_num, self.num_pages + 1)
  48. print(4)
  49. return range(self.current_page - part, self.current_page + part + 1)
  50.  
  51. def page_str(self):
  52. page_list = []
  53.  
  54. first = '<li><a href="/index2.html?p=1">首页</a></li>'
  55. page_list.append(first)
  56.  
  57. if self.current_page == 1:
  58. prev = '<li><a href="#">上一页</a></li>'
  59. else:
  60. prev = '<li><a href="/index2.html?p=%s">上一页</a></li>' % (self.current_page-1)
  61. page_list.append(prev)
  62.  
  63. for i in self.page_num_range():
  64. if i == self.current_page:
  65. temp = "<li class ='active'><a href='/index2.html?p=%s' >%s</a></li>"%(i,i)
  66. else:
  67. temp = "<li><a href='/index2.html?p=%s'>%s</a></li>" % (i, i)
  68. page_list.append(temp)
  69.  
  70. if self.current_page == self.num_pages:
  71. nex = '<a href="#">下一页</a>'
  72. else:
  73. nex = '<a href="/index2.html?p=%s">下一页</a>' % (self.current_page+1)
  74. page_list.append(nex)
  75.  
  76. last = '<a href="/index2.html?p=%s">尾页</a>' % self.num_pages
  77. page_list.append(last)
  78.  
  79. #列表迭代空格分割拼接
  80. return ''.join(page_list)

django的内置分页的更多相关文章

  1. Django内置分页

    一.django内置分页 from django.shortcuts import render from django.core.paginator import Paginator, EmptyP ...

  2. Djang内置分页和自定义分页

    内置分页 views from django.core.paginator import Paginator,Page,PageNotAnInteger def DJs_pages(request): ...

  3. django的内置信号

    Model singnalspre_init 在model执行构造方法之前自动触发post_init django的model在执行构造方法之后,自动触发pre_save django的对象保存之前, ...

  4. Django的内置登录、退出、修改密码方法

    Django中内置的登录.退出.修改密码方法. 1.url.py中使用django.contrib.auth中的views函数,django.views.generic中的TemplateView函数 ...

  5. Django 使用 内置 content-type

    django内置的content-type组件, 记录了项目中所有model元数据的表 可以通过一个ContentType表的id和一个具体表中的id找到任何记录,及先通过ContenType表的id ...

  6. Django扩展内置User类

    内置User类 使用内置User可以方便实现登录验证,利用Admin管理界面还可以方便添加.删除.修改用户. 一个内置的User类定义了以下字段: username: 用户名 password: 密码 ...

  7. Django 内置分页的简单使用

    1, 文档 https://docs.djangoproject.com/en/1.11.1/topics/pagination/ 2,视图 from django.core.paginator im ...

  8. Django 内置分页--Paginator类

    官方文档 http://python.usyiyi.cn/django/topics/pagination.html 前端方法 http://www.tuicool.com/articles/RniU ...

  9. Django,ajax实现表格增删查改,Django内置分页功能。

    1.工程目录 2.urls.py """Django_ajax URL Configuration The `urlpatterns` list routes URLs ...

随机推荐

  1. django template模板 母板 include导入

    一,使用{% block name %}{% endblock %}定义一个模板,在模板页面中它的内容为空,在各页面用{% block name %}自己的标签内容{% endblock %}调用. ...

  2. 京东饭粒捡漏V1.1.0

    20180624 更新 V1.1.01.解决进程残留问题:2.加入急速下单模式: 功能介绍1.京东商城专用,支持饭粒模式下单,自己获得京豆返利 2.捡漏模式:帮助用户监控抢购商品,有库存的时候进行抢单 ...

  3. Ubuntu14.04安装 ROS 安装步骤和问题总结

    参考: 1.http://wiki.ros.org/indigo/Installation/Ubuntu 2.安装出现依赖库问题: https://answers.ros.org/question/3 ...

  4. 基于STM8的ADC读取---STM8-第四章

    1. 综诉 想学会如何在STM8上使用ADC这个功能,我们先得了解单片机中ADC究竟是什么. ADC是模拟信号转成数值信号,单片机只能识别TTL电平,其实就是 1 或者 0 ,但是如果我们给它一个3. ...

  5. [UE4]让箭头保持水平

    如图所示,当手柄前后左右转动的时候,箭头也会跟着转动,我们的目标是要求箭头紧贴着地面,不会跟着手柄前后左右转动. 分析上图坐标系可以知道,只要让箭头绕着Z轴转动就可以了,不需要绕着X轴和Y轴旋转. 

  6. 部署GlusterFS及Heketi

    一.前言及环境 在实践kubernetes的StateFulSet及各种需要持久存储的组件和功能时,通常会用到pv的动态供给,这就需要用到支持此类功能的存储系统了.在各类支持pv动态供给的存储系统中, ...

  7. Spring获取URL相关信息

    获取请求的URL:request.getRequestURL().toString(); 获取上下文名称(项目名称):request.getContextPath()

  8. oracle锁表+解锁

    一.锁表: LOCK TABLE tablename IN EXCLUSIVE MODE; 二.解锁 * 1.首先用dba账户登录数据库 * * 2.查出被锁定的对象 * select * from ...

  9. WPF DEV gridcontrol当前项的数据导出为mdb文件

    /// <summary> /// 导出为mdb /// </summary> /// <param name="sender"></pa ...

  10. python中令人惊艳的小众数据科学库

    Python是门很神奇的语言,历经时间和实践检验,受到开发者和数据科学家一致好评,目前已经是全世界发展最好的编程语言之一.简单易用,完整而庞大的第三方库生态圈,使得Python成为编程小白和高级工程师 ...