""" 分页组件,武沛奇视频课件讲解 """ from django.utils.safestring import mark_safe class Pagination(object): def __init__(self, request, queryset, PAGE_SIZE=10, page_param='indexPage', PLUS_NAV=5): """ :param request: 视图函数,请求的对象 :param queryset: 传递过来的查询结果集,符合条件的记录 :param PAGE_SIZE: 每页显示记录数 :param page_param: 前端传递过来的页码 eg:/list/?indexPage=12 :param PLUS_NAV: 页码前后各几页 """ # 为解决搜索后,分页导航url地址丢失的问题 import copy # 将url地址中所带的参数复制一份 query_dict = copy.deepcopy(request.GET) # 允许修改 query_dict._mutable = True self.query_dict = query_dict self.page_param = page_param page = request.GET.get(page_param, '1') # 当前页,默认第1页,如果是跳转的就读indexPage输入框内的值 if page.isdecimal(): # 判断page是否是一个数字 page = int(page) else: page = 1 self.page = page self.page_size = PAGE_SIZE # 每页10条数据 self.star_page_data = (page - 1) * PAGE_SIZE # 开始数据 self.end_page_data = page * PAGE_SIZE # 结束数据 # star_page_data 开始记录数 # end_page_data 结束记录数 # [0:10] 取前10条数据 self.page_queryset = queryset[self.star_page_data:self.end_page_data] # 统计共有多少条数据 # total_count_data 总记录数 total_count_data = queryset.count() # 计算总页数 方法:通过总记录数和每页显示数相除 # divmod函数是python自带函数,计算两数相除同时获得商和余数,例如 divmod(91,10) 结果等于 {9,1} # total_count_page总页数 , mod就是余数 total_count_page, mod = divmod(total_count_data, PAGE_SIZE) if mod: total_count_page += 1 # 如果有余数总页数+1 self.total_count_page = total_count_page self.plus_nav = PLUS_NAV # 生成分页导航条 def html(self): """ 生成分页导航条 计算出当前页前5页和后5页的页码 self.plus_nav 前后显示几页 star_page 起始页 end_page 结束页 total_count_page 总页数 page_nav 导航条的html代码 """ # 计算导航栏页码数和显示方式(要考虑翻页时的极值) # 效果是前5页和后5页 self.plus_nav # 当数据量少比如只有100条数据以内,则展示全部导航条 if self.total_count_page <= self.plus_nav * 2: star_page = 1 end_page = self.total_count_page else: # 大于100条数据时 显示前后5条数据 # 如果当前页小于5条(极植) if self.page <= self.plus_nav: star_page = 1 end_page = self.plus_nav * 2 else: # 当前是每后一页时(极植) if (self.page + self.plus_nav) >= self.total_count_page: star_page = self.total_count_page - self.plus_nav * 2 # 显示前10页导航 end_page = self.total_count_page else: star_page = self.page - self.plus_nav end_page = self.page + self.plus_nav # 生成分页导航条的html代码,并传递给前端 page_list = [] # 首页 # prev = '