自定义模块 实现分页功能

 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">&laquo;</span></a></li>')
76         else:
77             # 加一个上一页的标签
78             html_str.append('<li><a href="{}?page={}"><span aria-hidden="true">&laquo;</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">&raquo;</span></a></li>')
93         else:
94             html_str.append('<li><a href="{}?page={}"><span aria-hidden="true">&raquo;</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})

 

posted @ 2018-09-08 07:55  青红*皂了个白  阅读(178)  评论(0编辑  收藏  举报