Django中封装分页组件

打印 上一主题 下一主题

主题 866|帖子 866|积分 2598

Django中封装分页组件

(1) 定义Paginator类
  1. from django.utils.safestring import mark_safe
  2. class Paginator(object):
  3.     """
  4.     初始化参数说明:
  5.     request:请求对象
  6.     data:查询到的符合条件的数据
  7.     search_data:搜索框收索的关键字,解决收索情况下分页的BUG
  8.     page_parm:分页请求的参数名称,例如:http://127.0.0.1:8000/phonenum/list/?page=2&q=
  9.     page_size:每页显示的数据量
  10.     plus:当前页分页按钮的两边显示的按钮数量
  11.     """
  12.     def __init__(self, request, data, search_data, page_parm="page", page_size=15, plus=5):
  13.         page = request.GET.get(page_parm, "")
  14.         if page.isdecimal():
  15.             page = int(page)
  16.         else:
  17.             page = 1
  18.         self.page = page
  19.         self.page_size = page_size
  20.         self.start = (page - 1) * page_size
  21.         self.end = page * page_size
  22.         self.data = data[self.start:self.end]
  23.         total_count = data.count()
  24.         total_page_count, div = divmod(total_count, page_size)
  25.         if div:
  26.             total_page_count += 1
  27.         self.total_page_count = total_page_count
  28.         self.plus = plus
  29.         self.search_data = search_data
  30.         self.page_parm = page_parm
  31.     # 生成html标签
  32.     def Html(self):
  33.         if self.total_page_count <= 2 * self.plus + 1:
  34.             start_page = 1
  35.             end_page = self.total_page_count
  36.         else:
  37.             if self.page < self.plus:
  38.                 start_page = 1
  39.                 end_page = 2 * self.plus
  40.             else:
  41.                 if (self.page + self.plus) > self.total_page_count:
  42.                     start_page = self.total_page_count - 2 * self.plus
  43.                     end_page = self.total_page_count
  44.                 else:
  45.                     start_page = self.page - self.plus
  46.                     end_page = self.page + self.plus
  47.         # 分页按钮
  48.         page_str_list = []
  49.         # 首页
  50.         first_page = '<li><a target="_blank" href="https://www.cnblogs.com/?{}={}&q={}">首页</a></li>'.format(self.page_parm, 1, self.search_data)
  51.         page_str_list.append(first_page)
  52.         # 上一页
  53.         if self.page > 1:
  54.             pre = '<li><a target="_blank" href="https://www.cnblogs.com/?{}={}&q={}">上一页</a></li>'.format(self.page_parm, self.page - 1, self.search_data)
  55.         else:
  56.             pre = '<li><a target="_blank" href="https://www.cnblogs.com/?{}={}&q={}">上一页</a></li>'.format(self.page_parm, 1, self.search_data)
  57.         page_str_list.append(pre)
  58.         for i in range(start_page, end_page + 1):
  59.             if i == self.page:
  60.                 ele = '<li ><a target="_blank" href="https://www.cnblogs.com/?{}={}&q={}">{}</a></li>'.format(self.page_parm, i, self.search_data,
  61.                                                                                     i)
  62.             else:
  63.                 ele = '<li><a target="_blank" href="https://www.cnblogs.com/?{}={}&q={}">{}</a></li>'.format(self.page_parm, i, self.search_data, i)
  64.             page_str_list.append(ele)
  65.         # 下一页
  66.         if self.page < self.total_page_count:
  67.             next = '<li><a target="_blank" href="https://www.cnblogs.com/?{}={}&q={}">下一页</a></li>'.format(self.page_parm, self.page + 1, self.search_data)
  68.         else:
  69.             next = '<li><a target="_blank" href="https://www.cnblogs.com/?{}={}&q={}">下一页</a></li>'.format(self.page_parm, self.total_page_count,
  70.                                                                    self.search_data)
  71.         page_str_list.append(next)
  72.         # 尾页
  73.         last_page = '<li><a target="_blank" href="https://www.cnblogs.com/?{}={}&q={}">尾页</a></li>'.format(self.page_parm, self.total_page_count,
  74.                                                                    self.search_data)
  75.         page_str_list.append(last_page)
  76.         search_string = """
  77.                         
  78.                             <form method="get">
  79.                                 
  80.                                     <input type="text"  placeholder="请输入页码" name="{}">
  81.                                     
  82.                                         <button  type="submit">跳转</button>
  83.                                     
  84.                                 
  85.                             </form>
  86.                         
  87.                         """.format(self.page_parm)
  88.         page_str_list.append(search_string)
  89.         page_string = mark_safe("".join(page_str_list))
  90.         return page_string
复制代码
(2) 导入Paginator类,传入参数如下所示
  1. def phoneNum_list(request):
  2.     """靓号列表"""
  3.     data_dict={}
  4.     search_data=request.GET.get("q","")
  5.     if search_data:
  6.         data_dict["phone_num__contains"]=search_data
  7.     # 分页
  8.     data = PrettyPhoneNum.objects.filter(**data_dict).order_by("level")
  9.     page_object=Paginator(request,data,search_data) # 其他三个参数根据需求调整
  10.     context={
  11.         "data": page_object.data,
  12.         "search_data": search_data,
  13.         "page_string": page_object.Html()
  14.     }
  15.     return render(request,"phonenum_list.html",context)
复制代码
data为查询到的分页后的数据,search_data为收索的关键字,返回用于搜索框保留上次搜索的内容,page_string为分页按钮
(3) 在前端显示分页按钮
  1. <nav aria-label="...">
  2.      <ul >
  3.           {{ page_string }}
  4.      </ul>
  5. </nav>
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表