前言

django也有自带额分页器,但是功能较少,使用起来较为繁琐。所以我们可以使用自定义非分页器。

自定义分页器的推导思路

# queryset对象是支持索引切片操作的(不支持负数索引)
book_queryset=models.Book.objects.all()
page_queryset=book_queryset[page_obj.start:page_obj.end]
​
# 如何获取用户访问的页数?
get请求是可以携带参数:url?page
默认显示的是第一页:current_page=request.GET.get("page",1)
"page"参数非法,则显示默认的第一页
​
# 设定每页的展示的记录数?
per_page_num=10
​
# 切片的起始位置和结束位置
start_page=(current_page-1)*10
end_page=current_page*10
​
# 获取展示数据的总条数
record_count=book_queryset.count() //通过queryset对象的count方法获取数据库数据的总条数
​
# 确定总的数据需要多少页才能展示
内置方法divmod()
base_page,is_carry=divmod(record_count,per_page_num)
​
# 前端模板语法没有range功能
前端代码后端书写,写完传给前端
​
# 针对展示页码的需要自己规划好到底展示多少个页码
一般情况下页码的个数设计都是奇数(符合审美标准)  11个页码
当前页减5
当前页加6
你可以给标签价样式从而让选中的页码高亮显示
​
# 针对页码小于6的情况 你需要做处理 不能再减

思路有了,那就撸起袖子写吧。

封装好的代码

"""
自定义分页器代码
"""
​
class Pager(object):def __init__(self, current_page, record_count, per_page_num=8, pager_count=11):"""current_page:当前页record_count:数据库中记录的总条数per_page_num:每页最多展示的条数pager_count: 分页器同时展示的最大数"""self.current_page = self.page(current_page)self.record_count = record_countself.per_page_num = per_page_numself.pager_count = pager_countself.pager_count_half = int(pager_count) // 2
​@staticmethoddef page(page):if not isinstance(page, int):page = int(page) if page.isdigit() else 1page = page if page > 1 else 1return page
​@propertydef all_page(self):base_page, is_carry = divmod(self.record_count, self.per_page_num)return base_page if not is_carry else (base_page + 1)
​@propertydef start(self):"""切片操作的初始索引"""return (self.current_page - 1) * self.per_page_num
​@propertydef end(self):"""切片操作的结束索引"""return self.current_page * self.per_page_num
​def page_html(self):# 如果总页码小于11个if self.all_page <= self.pager_count:pager_start = 1pager_end = self.all_page + 1else:"""总页码大于11个"""if self.current_page <= self.pager_count_half:# 当前页小于等于5页pager_start = 1pager_end = self.pager_count + 1else:# 当前页大于5页if self.current_page + self.pager_count_half > self.all_page:pager_start = self.all_page - self.pager_count + 1pager_end = self.all_page + 1else:pager_start = self.current_page - self.pager_count_halfpager_end = self.current_page + self.pager_count_half + 1page_html_list = ["""<nav aria-label="Page navigation"><ul class="pagination">"""]first_page = '<li><a href="?page=%s">首页</a></li>' % (1)page_html_list.append(first_page)if self.current_page == 1:prev_page = '<li class="disabled " ><a href="#">%s</a></li>' % ('<<',)else:prev_page = '<li ><a href="?page=%s">%s</a></li>' % (self.current_page - 1, '<<',)page_html_list.append(prev_page)for item in range(pager_start, pager_end):if item == self.current_page:common_page = '<li class="active " ><a href="?page=%s">%s</a></li>' % (item, item,)else:common_page = '<li ><a href="?page=%s" >%s</a><li>' % (item, item,)page_html_list.append(common_page)if self.current_page >= self.all_page:next_page = '<li class="disabled " ><a href="#">%s</a></li>' % ('>>',)else:next_page = '<li ><a href="?page=%s">%s</a></li>' % (self.current_page + 1, '>>')page_html_list.append(next_page)last_page = '<li ><a href="?page=%s">尾页</a></li>' % (self.all_page,)page_html_list.append(last_page)# 尾部添加标签page_html_list.append("""</ul></nav>""")return ''.join(page_html_list)

使用

注意:

"""
当我们需要使用到非django内置的第三方功能或者组件代码的时候,一般情况下会创建一个名为utils文件夹,在该文件夹内对模块进行功能性划分,utils可以在每个应用下创建,需要具体结合实际情况。
​
我们自定义的分页器是基于bootstrap样式来的,所以你需要提前导入bootstrap:
(1)bootstrap 版本 v3
(2)jQuery 版本 v3
"""
└── utils├── pager.py└── __pycache__└── pager.cpython-38.pyc

django后端:

class Book(View):def get(self, request, phone):user_obj = models.User.objects.filter(phone=phone).first()book_list = models.Book.objects.all()current_page = request.GET.get("page", 1)record_count = book_list.count()page_obj = pager.Pager(current_page, record_count, per_page_num=7, pager_count=11)page_queryset = book_list[page_obj.start:page_obj.end]return render(request, 'book.html',{'user': user_obj, 'page': page_obj, 'page_queryset': page_queryset})

前端:

   <div class="col-lg-6"><div class="input-group"><input type="text" class="form-control" placeholder="书名~"><span class="input-group-btn"><button class="btn btn-success" type="button">搜索~</button></span></div><!-- /input-group --></div><div class="col-lg-6 text-right"><a href="{% url 'app01:book_add' user.phone %}" class="btn btn-success">添加书籍</a></div><br><br><br><div class="col-lg-10 col-lg-offset-1"><table class="table table-bordered table-striped table-hover"><thead><tr><th class="text-center thead-style">序号</th><th class="text-center thead-style">书名</th><th class="text-center thead-style">价格(元)</th><th class="text-center thead-style">作者</th><th class="text-center thead-style">出版日期</th><th class="text-center thead-style">出版社</th><th class="text-center thead-style">操作</th></tr></thead><tbody>{% for book in page_queryset %}<tr><td class="text-center tbody-style">{{ page.start|add:forloop.counter }}</td><td>{{ book.name }}</td><td class="text-center">{{ book.price }}</td><td>{% for author in book.authors.all %}{% if forloop.last %}{{ author.name }}{% else %}{{ author.name }}|{% endif %}{% endfor %}</td><td class="text-right">{{ book.publish_date|date:'Y/m/d' }}</td><td class="text-center">{{ book.publish.name }}</td><td class="text-center"><a href="{% url 'app01:book_edit' user.phone book.id %}"class="btn btn-primary btn-xs">编辑</a><button class="btn btn-danger btn-xs del" delete_id="{{ book.pk }}">删除</button></td></tr>{% endfor %}</tbody></table><div class="text-center">{{ page.page_html|safe }}</div></div>

效果展示

效果图1
效果图2

page 怎么把list 分页_自定义分页器的实现相关推荐

  1. antd自定义分页器_自定义分页器

    classPagination(object):def __init__(self, current_page, all_count, per_page_num=10, pager_count=11) ...

  2. antv图例出现分页_自定义图例组件

    源码复制成功复制失败全屏 复制 运行 自定义图例组件 #map { position:absolute; top:0; bottom:0; width:100%; } .infolegend { pa ...

  3. Django 基础(12)-Django drf 分页查询(批量查询)、自定义分页器

    文章目录 Django drf 分页查询(批量查询) PageNumberPagination:普通分页 Django 自定义分页器 自定义批量查询的返回结构 LimitOffsetPaginatio ...

  4. antd自定义分页器_从零开始实现类 antd 分页器(二):分页核心代码

    本文是使用 Typescript 开发类 antd 分页器,并发布 npm 的第二篇,因为最近在业务中使用了 antd 中的 Pagination 开发了相关业务,而自己又对组件的封装由很有兴趣,所以 ...

  5. Web框架之Django_07 进阶操作(MTV与MVC、多对多表三种创建方式、前后端传输数据编码格式contentType、ajax、自定义分页器)

    阅读目录 一.MVC与MTV 二.多对多表的创建 三.ajax,前后端传输编码格式contentType 四.批量插入数据与自定义分页器 摘要 MTV与MVC 多对多表三种创建方式 ajax ,前后端 ...

  6. Django分页器和自定义分页器

    一.自定义分页器 import copyclass Pagination():def __init__(self,request,current_page,all_data_num,each_page ...

  7. Java IPage分页 加自定义sql

    Java IPage分页 加自定义sql 引入依赖 User实体类 controller service impl impl常规操作 impl自定义参数重写Sql 直接在impl 中写好 Sql 当作 ...

  8. Django之批量插入数据、 自定义分页器

    文章目录 一. 批量插入数据 方法一: 方法二: 批量插入bulk_create方法 二. 自定义分页器 2.1 分页推导 2.2 数据总页面获取 2.3 内置方法之divmod 三. 自定义分页器终 ...

  9. ThinkPHP3验证码、文件上传、缩略图、分页(自定义工具类、session和cookie)

    验证码 TP框架中自带了验证码类 位置:Think/verify.class.php 在LoginController控制器中创建生存验证码的方法 login.html登陆模板中 在LoginCont ...

最新文章

  1. 【读书笔记】iOS-网络-解析响应负载
  2. 微软招聘研究实习生,base美国or加拿大
  3. wpf 加载html页面,使用MVVM在WPF中显示HTML
  4. Perl 教学 Perl5中的引用(指针)
  5. Gitflow branch与Docker image tag命名冲突怎么办?
  6. 移动优先的响应式布局
  7. 1713. 得到子序列的最少操作次数
  8. 计算机时代 英语,雅思8分范文:计算机时代教师角色 【出国英语】
  9. 你知道嵌入式,那你看过这个吗?
  10. POJ1275Cashier Employment(查分约束系统)
  11. unity android 在后台运行_Android 11“精简版”正式发布,低端机也可以流畅运行
  12. CLR via C# 读书笔记 3-6 比较APM和EAP(异步编程模型和基于事件的编程模式)
  13. 航空运输安全及鉴定,保障货物成功抵达
  14. hr 标签可选的属性(续) 和 img 标签介绍
  15. 常用MAVROS话题和服务
  16. Javase杂谈(十)
  17. java高级人员必读十大书籍!
  18. 虚拟化(一):虚拟化及vmware产品介绍
  19. mysql 获得元素的数量_一个递归获取祖先元素值的MySQL函数范例
  20. Fast DDS和Cyclone DDS对比性能测试

热门文章

  1. 设计新Xlator扩展GlusterFS[转]
  2. C++ Primer Plus学习:第十章
  3. 如何在Membership中实现修改密码的功能
  4. AB1601spi传输慢的问题
  5. 第四章-分布式数据库HBase
  6. 跨链Cosmos(1) 网络拓扑
  7. Hyperledger Fabric 链码(3) 生命周期和API
  8. 《研磨设计模式》chap17 策略模式(2) 总结
  9. optee中core_init_mmu_regs函数解读
  10. OTA整包的制作流程(未完)