django分页再封装
时间:2021-08-09
本文章向大家介绍django分页再封装,主要包括django分页再封装使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文对django分页再封装
页码数量
默认采用百度的分页模式,只显示10页,可自定义
1.总页数少于10页,页面上显示所有页码
2.如果当前页是前6页,显示1-10页
3.如果当前页是后5页,显示后10页
4.其他情况,中间部分,显示当前页的前5页,当前页,当前页的后4页
封装分页
自行放到一个包下
参数见注释,
必传
queryset, page, base_url, query_params,
可选
page_size=20, page_count=1
from django.core.paginator import Paginator from django.utils.safestring import mark_safe def pagination(queryset, page, base_url, query_params, page_size=20, page_count=10): """ 分页组件 :param queryset: 要分页的查询集 :param page: 第几页 :param base_url: 基础URL:/goods/ :param query_params: QueryDict对象,内部含所有当前URL的原条件?a=1&b=2&a=3 :param page_size: 每页显示数据条数,默认每页20条 :param page_count: 共显示多少个页码按钮,默认10页 :return: 该页的查询集, 页码的html: li """ # 对数据进行分页 paginator = Paginator(queryset, page_size) # 获取第page页的内容 try: page = int(page) except Exception as e: page = 1 if page > paginator.num_pages: page = 1 # 获取第page页的Page对象 content_page = paginator.page(page) # todo: 进行页码控制,页面上最多显示n个页码,以5为例 # 1.总页数少于5页,页面上显示所有页码 # 2.如果当前页是前3页,显示1-5页 # 3.如果当前页是后3页,显示后5页 # 4.其他情况,中间部分,显示当前页的前2页,当前页,当前页的后2页 num_pages = paginator.num_pages # 总页数 if num_pages < page_count: pages = range(1, num_pages + 1) elif page <= (page_count//2)+1: pages = range(1, page_count+1) elif num_pages - page < page_count//2: pages = range(num_pages-page_count+1, num_pages + 1) else: pages = range(page-(page_count//2), page+((page_count//2))) page_list = [] query_params._mutable = True # 上一页 if content_page.has_previous(): query_params['page'] = content_page.previous_page_number() prev = '<li><a href="%s?%s">上一页</a></li>' % (base_url, query_params.urlencode()) # 可选去首页 else: prev = '<li class="disabled"><a href="javascript:;">上一页</a></li>' page_list.append(prev) # 页码列表 for pindex in pages: if pindex == content_page.number: tpl = '<li class="active"><a href="javascript:;">%s</a></li>' % pindex else: query_params['page']= pindex tpl = '<li><a href="%s?%s">%s</a></li>' % (base_url, query_params.urlencode(), pindex) page_list.append(tpl) # 下一页 if content_page.has_next(): query_params['page'] = content_page.next_page_number() next = '<li><a href="%s?%s">下一页</a></li>' % (base_url, query_params.urlencode(),) # 可选去尾页 else: next = '<li class="disabled"><a href="javascript:;">下一页</a></li>' page_list.append(next) # 可选 共100条数据,页码1/10页 if content_page.count: tpl = "<li class='disabled'><a>共%s条数据,页码%s/%s页</a></li>" % ( queryset.count(), page, num_pages) page_list.append(tpl) return content_page, mark_safe("".join(page_list))
视图使用
request.path_info:当前的url路径
request.GET:当前的url其他参数,
def index(request): queryset = Goods.objects.all() content_page, page_html = pagination(queryset, page=request.GET.get('page'), base_url=request.path_info, query_params=request.GET, page_size=10) return render(request, 'index.html', {'content_page': content_page, 'page_html ': page_html })
前端使用
极度简单
只要循环分页内容,和使用页码html即可
前端以bootstrap为便,只需要把page_html包在<ul class="pagination">内即可
{% for item in content_page %} <div>{{item}}</div> {% endfor %} <ul class="pagination"> {{ page_html }} </ul>
原文地址:https://www.cnblogs.com/viete/p/15118036.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浅谈布隆过滤器
- Python 技术篇-获取图片GPS信息,锁定追踪图片拍摄地点、拍摄时间
- 测试工具 - Postman接口测试入门使用手册,Postman如何进行数据关联、自动更新cookies、简单编程
- 白盒测试工具 - sonar的安装、配置与使用入门手册,用sonar检查代码质量实战演示
- Chmod -R 777 / 误操作恢复教程
- 最全总结 | 聊聊 Python 数据处理全家桶(Redis篇)
- 虚拟机安装mikrotik-ROS
- 搬砖武士|手把手教你在容器服务 TKE 上使用 LB直通 Pod
- linux安装snmp服务-ubuntu
- 企业微信机器人
- Kubernetes 新玩法:在 YAML 中编程
- 全网最实用 Python 面试题大全(花费了整整 3 天时间整理出来的)
- paramiko模块
- Loki 和 Fluentd 的那点事儿
- Hive改表结构的两个坑|避坑指南