此分页组件可以辅助完成项目中前端页面分页展示
  1. """
  2. 分页组件应用:
  3. 1. 在视图函数中
  4. queryset = models.Issues.objects.filter(project_id=project_id)
  5. page_object = Pagination(
  6. current_page=request.GET.get('page'),
  7. all_count=queryset.count(),
  8. base_url=request.path_info,
  9. query_params=request.GET
  10. )
  11. issues_object_list = queryset[page_object.start:page_object.end]
  12. context = {
  13. 'issues_object_list': issues_object_list,
  14. 'page_html': page_object.page_html()
  15. }
  16. return render(request, 'issues.html', context)
  17. 2. 前端
  18. {% for item in issues_object_list %}
  19. {{item.xxx}}
  20. {% endfor %}
  21. <nav aria-label="...">
  22. <ul class="pagination" style="margin-top: 0;">
  23. {{ page_html|safe }}
  24. </ul>
  25. </nav>
  26. """
  27. class Pagination(object):
  28. def __init__(self, current_page, all_count, base_url, query_params, per_page=30, pager_page_count=11):
  29. """
  30. 分页初始化
  31. :param current_page: 当前页码
  32. :param per_page: 每页显示数据条数
  33. :param all_count: 数据库中总条数
  34. :param base_url: 基础URL
  35. :param query_params: QueryDict对象,内部含所有当前URL的原条件
  36. :param pager_page_count: 页面上最多显示的页码数量
  37. """
  38. self.base_url = base_url
  39. try:
  40. self.current_page = int(current_page)
  41. if self.current_page <= 0:
  42. self.current_page = 1
  43. except Exception as e:
  44. self.current_page = 1
  45. query_params = query_params.copy()
  46. query_params._mutable = True
  47. self.query_params = query_params
  48. self.per_page = per_page
  49. self.all_count = all_count
  50. self.pager_page_count = pager_page_count
  51. pager_count, b = divmod(all_count, per_page)
  52. if b != 0:
  53. pager_count += 1
  54. self.pager_count = pager_count
  55. half_pager_page_count = int(pager_page_count / 2)
  56. self.half_pager_page_count = half_pager_page_count
  57. @property
  58. def start(self):
  59. """
  60. 数据获取值起始索引
  61. :return:
  62. """
  63. return (self.current_page - 1) * self.per_page
  64. @property
  65. def end(self):
  66. """
  67. 数据获取值结束索引
  68. :return:
  69. """
  70. return self.current_page * self.per_page
  71. def page_html(self):
  72. """
  73. 生成HTML页码
  74. :return:
  75. """
  76. if self.all_count == 0:
  77. return ""
  78. # 如果数据总页码pager_count<11 pager_page_count
  79. if self.pager_count < self.pager_page_count:
  80. pager_start = 1
  81. pager_end = self.pager_count
  82. else:
  83. # 数据页码已经超过11
  84. # 判断: 如果当前页 <= 5 half_pager_page_count
  85. if self.current_page <= self.half_pager_page_count:
  86. pager_start = 1
  87. pager_end = self.pager_page_count
  88. else:
  89. # 如果: 当前页+5 > 总页码
  90. if (self.current_page + self.half_pager_page_count) > self.pager_count:
  91. pager_end = self.pager_count
  92. pager_start = self.pager_count - self.pager_page_count + 1
  93. else:
  94. pager_start = self.current_page - self.half_pager_page_count
  95. pager_end = self.current_page + self.half_pager_page_count
  96. page_list = []
  97. if self.current_page <= 1:
  98. prev = '<li><a href="#">上一页</a></li>'
  99. else:
  100. self.query_params['page'] = self.current_page - 1
  101. prev = '<li><a href="%s?%s">上一页</a></li>' % (self.base_url, self.query_params.urlencode())
  102. page_list.append(prev)
  103. for i in range(pager_start, pager_end + 1):
  104. self.query_params['page'] = i
  105. if self.current_page == i:
  106. tpl = '<li class="active"><a href="%s?%s">%s</a></li>' % (
  107. self.base_url, self.query_params.urlencode(), i,)
  108. else:
  109. tpl = '<li><a href="%s?%s">%s</a></li>' % (self.base_url, self.query_params.urlencode(), i,)
  110. page_list.append(tpl)
  111. if self.current_page >= self.pager_count:
  112. nex = '<li><a href="#">下一页</a></li>'
  113. else:
  114. self.query_params['page'] = self.current_page + 1
  115. nex = '<li><a href="%s?%s">下一页</a></li>' % (self.base_url, self.query_params.urlencode(),)
  116. page_list.append(nex)
  117. if self.all_count:
  118. tpl = "<li class='disabled'><a>共%s条数据,页码%s/%s页</a></li>" % (
  119. self.all_count, self.current_page, self.pager_count,)
  120. page_list.append(tpl)
  121. page_str = "".join(page_list)
  122. return page_str

项目组件:分页(pagination)的更多相关文章

  1. amazeui学习笔记--css(常用组件11)--分页Pagination

    amazeui学习笔记--css(常用组件11)--分页Pagination 一.总结 1.分页使用:还是ul包li的形式: 分页组件,<ul> / <ol> 添加 .am-p ...

  2. drf-过滤组件|分页组件|过滤器

    目录 drf-过滤组件|分页组件|过滤器 群查接口各种筛选组件数据准备 drf过滤组件 搜索过滤组件 | SearchFilter 案例: 排序过滤组件 | OrderingFilter 案例: dr ...

  3. Django项目实战—分页

    自定义分页 未封装版: 优点:直观 缺点:代码乱,不易维护,可拓展性差 data = [] for i in range(1, 302): tmp = {"id": i, &quo ...

  4. 关于vue+element-ui项目的分页,返回默认显示第一页的问题解决

    关于vue+element-ui项目的分页,返回默认显示第一页的问题解决     问题描述 当前页面如下: 然后点击页码跳到第3页,然后在第三页点击页面链接跳转到新的页面 然后在新页面点击返回按钮,返 ...

  5. Django-rest-framework 接口实现 分页:(Pagination) 解析器(Parser) 渲染器(renderer)

    分页:(Pagination) rest_framework 中已经定义好了 3 种 分页模式 from rest_framework.pagination import PageNumberPagi ...

  6. 在Visual Studio中使用组件图描述项目组件依赖关系

    如果想描述项目组件的关系,可以考虑使用UML组建图. 在建模项目下添加一个名称为"Applicaiton Component Structure"的UML组建图. 添加各个组件,并 ...

  7. S2SH项目实现分页功能

    javaWEB项目实现分页的方法很多,网上也有很多列子,最近工作中S2SH框架项目中需要一个分页的功能,查看了很多用一下方式实现,功能思路很清晰,觉得是很好的一种实现方法,记录下便多学习. 刚开始得到 ...

  8. 应用五:Vue之ElementUI 表格Table与分页Pagination组件化

    (注:本文适用于有一定Vue基础或开发经验的读者,文章就知识点的讲解不一定全面,但却是开发过程中很实用的) 在平时的web项目开发过程中,列表分页查询展示应用的很频繁,为了便于阅读并减少代码的冗余,所 ...

  9. 15 自定义分页pagination全局组件

    1.Pagination.vue <template> <el-pagination @size-change="handleSizeChange" @curre ...

随机推荐

  1. WEB渗透 - XSS

    听说这个时间点是人类这种生物很重要的一个节点 cross-site scripting 跨站脚本漏洞 类型 存储型(持久) 反射型(非持久) DOM型 利用 先检测,看我们输入的内容是否有返回以及有无 ...

  2. Mysql数据库定时全库备份

    如下脚本用于mysql全库定时备份 mysql_dump_script.sh #!/bin/bash #保存备份个数,最多保留4个文件 number=4 #备份保存路径 backup_dir=/db/ ...

  3. aosp 制作 rom 刷机 添加厂家二进制驱动 及 出厂镜像

    首先介绍下背景知识. aosp 仅是一套源码,不含厂家驱动. CM安卓的厂家驱动是自行提取的. 一般的安卓手机分区,有 boot , system, user , Baseband 基带, recov ...

  4. Numpy之数据保存与读取

      在pandas使用的25个技巧中介绍了几个常用的Pandas的使用技巧,不少技巧在机器学习和深度学习方面很有用处.本文将会介绍Numpy在数据保存和读取方面的内容,这些在机器学习和深度学习方向也大 ...

  5. 关于“关键字synchronized不能被继承”的一点理解

    网上看到很多对关键字synchronized继承性的描述只有一句"关键字synchronized不能被继承",并没有描述具体场景,于是自己做了以下测试. //父类 public c ...

  6. django 从零开始 13 返回文件

    进行一些操作返回文件,flask和django差不多,基本都是在返回response 并且对其中的返回头部写入返回文件信息 # image def image(request): f = open(r ...

  7. Python 3:ImportError “No Module named Setuptools”的解决方法

    sudo apt-get install python-setuptools python3-setuptools

  8. Python基础篇(三)_函数及代码复用

    Python基础篇_函数及代码复用 函数的定义.使用: 函数的定义:通过保留字def实现. 定义形式:def <函数名>(<参数列表>): <函数体> return ...

  9. 我的MacbookPro进水了!维修过程记录

    电脑进水与解决方案 如果事情有变坏的可能,不管这种可能性有多小,它总会发生.---墨菲定律 进水过程 2020年03月21日日下午3点左右,不小心把水杯碰倒了,水通过电脑右侧的键盘处进入了大概有10毫 ...

  10. ElegantSnap 一个优雅的,易用的iOS/tvOS/macOS自动布局框架, 超级详细的使用教程,多视图水平等宽/垂直等高排列

    ElegantSnap ElegantSnap(Base on SnapKit) to make Auto Layout easy and elegant on both iOS and OS X. ...