自定义模块 实现分页功能
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #分页工具包 2 class Page(): 3 def __init__(self,current_page,tote_count,url_prefix,page_num,max_page): 4 """ 5 :param current_page: 当前页码数 6 :param tote_count: 总数条数 7 :param url_prefix: a标签href前缀 访问哪张表 8 :param page_num: 单页面数据条数 9 :param max_page: 页码显示最大量 10 """ 11 12 self.current_page=int(current_page) 13 self.tote_count=tote_count 14 self.url_prefix=url_prefix 15 self.page_num=page_num 16 self.max_page=max_page 17 18 #共需要多少页码来显示 19 pages,mov=divmod(self.tote_count,self.page_num) 20 if mov: # 有值则证明有余数 不足一页的记录 21 pages+=1 22 self.pages=pages #算出的总页码数 23 24 try: 25 # 如果输入的页码数超过了最大的页码数,默认返回最后一页 26 if self.current_page > self.pages: 27 self.current_page = self.pages 28 except Exception as e: 29 # 当输入的页码不是正经数字的时候 默认返回第一页的数据 30 self.current_page = 1 31 32 #如果总页码数小于最大页码数 比如就2页小于11页 最大页码数为总页码数 33 if self.pages<self.max_page: 34 self.max_page=self.pages 35 36 #需要显示的页码范围 37 page_long=self.max_page//2 38 start_page=self.current_page-page_long #当前页面往前页码 39 end_page=self.current_page+page_long #当前页面往后页码 40 41 #开始页面小于1,则改为第一页,尾页就是最大页码数 42 if start_page<1: 43 start_page=1 44 end_page=self.max_page 45 #结束页面大于总页面数,直接置为尾页,它的起始页为减max_page 但是算上自己会多一页 46 #所以+1 ,让起始值往后退一个,恰好等于 47 if end_page>pages: 48 end_page=pages 49 start_page=pages-self.max_page+1 50 51 #把start_page和end_page作为类的静态属性 可以被类下的其他方法调用 52 self.start_page=start_page 53 self.end_page=end_page 54 55 #把分割字符串的起始变量做成类的方法属性,能直接被调用 56 self.star = (self.current_page - 1) * self.page_num 57 self.end = self.current_page * self.page_num 58 59 @property #静态属性被类的对象调用 60 def start(self): 61 return self.star 62 63 @property 64 def end(self): 65 return self.end 66 67 def page_html(self): 68 # 自己拼接分页的HTML代码 69 html_str = [] 70 # 加上第一页 71 html_str.append('<li><a href="{}?page=1">首页</a></li>'.format( self.url_prefix)) 72 73 # 判断一下 如果是第一页,就没有上一页 74 if self.current_page <= 1: 75 html_str.append('<li class="disabled"><a href="#"><span aria-hidden="true">«</span></a></li>') 76 else: 77 # 加一个上一页的标签 78 html_str.append('<li><a href="{}?page={}"><span aria-hidden="true">«</span></a></li>'.format(self.url_prefix,self.current_page - 1)) 79 80 for i in range(self.start_page, self.end_page+1): 81 # 如果是当前页就加一个active样式类 82 if i == self.current_page: 83 tmp = '<li class="active"><a href="{0}?page={1}">{1}</a></li>'.format(self.url_prefix, i) 84 else: 85 tmp = '<li><a href="{0}?page={1}">{1}</a></li>'.format( self.url_prefix, i) 86 87 html_str.append(tmp) 88 89 # 加一个下一页的按钮 90 # 判断,如果是最后一页,就没有下一页 91 if self.current_page >= self.pages: 92 html_str.append('<li class="disabled"><a href="#"><span aria-hidden="true">»</span></a></li>') 93 else: 94 html_str.append('<li><a href="{}?page={}"><span aria-hidden="true">»</span></a></li>'.format(self.url_prefix,self.current_page + 1)) 95 # 加最后一页 96 html_str.append('<li><a href="{}?page={}">尾页</a></li>'.format(self.url_prefix, self.pages)) 97 98 page_html = "".join(html_str) 99 return page_html
调用模块首先要导入对应模块和类
1 from book_sys.mypage import Page 2 def page(request): 3 num=request.GET.get('page') 4 d_count=models.Person.objects.all().count() 5 6 page_obj=Page(num,d_count,'press',10,11) 7 ret=models.Person.objects.all()[page_obj.star:page_obj.end] 8 page_html=page_obj.page_html() 9 return render(request,'show.html',{'press':ret,'page_html':page_html})