""" 分页组件,武沛奇视频课件讲解 """ 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 = '
  • 首页
  • ' # 向url地址中拼接参数 self.query_dict.setlist(self.page_param, [1]) # 取得拼接后的url地址self.query_dict.urlencode() prev = f'
  • ' page_list.append(prev) # 上一页 if self.page > 1: self.query_dict.setlist(self.page_param, [self.page - 1]) prev = f'
  • 上一页
  • ' page_list.append(prev) for i in range(star_page, end_page + 1): # range前取后不取所以+1 self.query_dict.setlist(self.page_param, [i]) if i == self.page: ele = f'
  • {i}
  • ' # 给当前页加效果 else: ele = f'
  • {i}
  • ' page_list.append(ele) # 下一页 if self.page < self.total_count_page: self.query_dict.setlist(self.page_param, [self.page + 1]) prev = f'
  • 下一页
  • ' page_list.append(prev) # 尾页 # prev = f'
  • 尾页
  • ' self.query_dict.setlist(self.page_param, [self.total_count_page]) prev = f'
  • ' page_list.append(prev) # 构建跳转html page_nav_search = """
  • """ page_list.append(page_nav_search) page_nav = ''.join(page_list) # 因为page_nav是一个html字符串,所以在传递到前端时要转换为安全的字符串 page_nav = mark_safe(page_nav) """分页实现结束""" return page_nav