django分页设计并封装

Posted changwoo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django分页设计并封装相关的知识,希望对你有一定的参考价值。

一、封装后的代码

二、在视图函数中如何调用

三、get点

 

 

一、封装后的代码

技术分享图片
 1 class Page():
 2 
 3     def __init__(self, page_num, total_count, url_prefix, per_page=10, max_page=11):
 4         """
 5 
 6         :param page_num: 当前页码数
 7         :param total_count: 数据总数
 8         :param url_prefix: a标签href的前缀
 9         :param per_page: 每页显示多少条数据
10         :param max_page: 页面上最多显示几个页码
11         """
12         self.url_prefix = url_prefix
13         self.max_page = max_page
14         # 每一页显示多少条数据
15         # 总共需要多少页码来展示
16         total_page, m = divmod(total_count, per_page)
17         if m:
18             total_page += 1
19         self.total_page = total_page
20 
21         try:
22             page_num = int(page_num)
23             # 如果输入的页码数超过了最大的页码数,默认返回最后一页
24             if page_num > total_page:
25                 page_num = total_page
26         except Exception as e:
27             # 当输入的页码不是正经数字的时候 默认返回第一页的数据
28             page_num = 1
29         self.page_num = page_num
30 
31         # 定义两个变量保存数据从哪儿取到哪儿
32         self.data_start = (page_num - 1) * 10
33         self.data_end = page_num * 10
34 
35         # 页面上总共展示多少页码
36         if total_page < self.max_page:
37             self.max_page = total_page
38 
39         half_max_page = self.max_page // 2
40         # 页面上展示的页码从哪儿开始
41         page_start = page_num - half_max_page
42         # 页面上展示的页码到哪儿结束
43         page_end = page_num + half_max_page
44         # 如果当前页减一半 比1还小
45         if page_start <= 1:
46             page_start = 1
47             page_end = self.max_page
48         # 如果 当前页 加 一半 比总页码数还大
49         if page_end >= total_page:
50             page_end = total_page
51             page_start = total_page - self.max_page + 1
52         self.page_start = page_start
53         self.page_end = page_end
54 
55     @property
56     def start(self):
57         return self.data_start
58 
59     @property
60     def end(self):
61         return self.data_end
62 
63 
64     def page_html(self):
65         # 自己拼接分页的HTML代码
66         html_str_list = []
67         # 加上第一页
68         html_str_list.append(<li><a href="{}?page=1">首页</a></li>.format( self.url_prefix))
69 
70         # 判断一下 如果是第一页,就没有上一页
71         if self.page_num <= 1:
72             html_str_list.append(<li class="disabled"><a href="#"><span aria-hidden="true">&laquo;</span></a></li>.format(self.page_num-1))
73         else:
74             # 加一个上一页的标签
75             html_str_list.append(<li><a href="{}?page={}"><span aria-hidden="true">&laquo;</span></a></li>.format( self.url_prefix, self.page_num-1))
76 
77         for i in range(self.page_start, self.page_end+1):
78             # 如果是当前页就加一个active样式类
79             if i == self.page_num:
80                 tmp = <li class="active"><a href="{0}?page={1}">{1}</a></li>.format(self.url_prefix, i)
81             else:
82                 tmp = <li><a href="{0}?page={1}">{1}</a></li>.format( self.url_prefix, i)
83 
84             html_str_list.append(tmp)
85 
86         # 加一个下一页的按钮
87         # 判断,如果是最后一页,就没有下一页
88         if self.page_num >= self.total_page:
89             html_str_list.append(<li class="disabled"><a href="#"><span aria-hidden="true">&raquo;</span></a></li>)
90         else:
91             html_str_list.append(<li><a href="{}?page={}"><span aria-hidden="true">&raquo;</span></a></li>.format( self.url_prefix, self.page_num+1))
92         # 加最后一页
93         html_str_list.append(<li><a href="{}?page={}">尾页</a></li>.format( self.url_prefix, self.total_page))
94 
95         page_html = "".join(html_str_list)
96         return page_html
mypage.py

 

二、在视图函数中如何调用

技术分享图片
 1 from app.mypage import Page
 2 
 3 def books(request):
 4     # 以参数形式得到当前的page页
 5     page_num = request.GET.get(page)
 6     total_count = models.Book.objects.all().count()
 7     page_obj = Page(page_num, total_count, url_prefix=/books/)
 8     ret = models.Book.objects.all()[page_obj.start: page_obj.end]
 9     page_html = page_obj.page_html()
10     return render(request, books.html, {books: ret, page_html: page_html})
views.py
技术分享图片
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>test demo</title>
 6     <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
 7 </head>
 8 <body>
 9 <div class="container">
10     <table class="table table-bordered">
11         <thead>
12         <tr>
13             <th>number</th>
14             <th>id</th>
15             <th>name</th>
16         </tr>
17         </thead>
18         <tbody>
19         {% for book in books %}
20             <tr>
21                 <td>{{ forloop.counter }}</td>
22                 <td>{{ book.id }}</td>
23                 <td>{{ book.name }}</td>
24             </tr>
25         {% endfor %}
26         </tbody>
27     </table>
28     <nav aria-label="Page navigation">
29         <ul class="pagination">
30             {{ page_html|safe }}
31         </ul>
32     </nav>
33 
34 </div>
35 </body>
36 </html>
books.html

 

三、get点

1.未封装的代码

技术分享图片
 1 def books(request):
 2     page_num = request.GET.get("page")  # 127.0.0.1:8000/book/?page=1
 3     #  每页显示多少数据
 4     per_page = 10
 5     #  总数据是多少
 6     total_count = models.Book.objects.all().count()
 7     #  总共需要多少页码来展示
 8     total_page, m = divmod(total_count, per_page)  # divmod(23, 3);divmod(20,0)
 9     if m:
10         total_page += 1
11     try:
12         page_num = int(page_num)  # 得到的page参数是字符串形式的
13         if page_num > total_page:
14             page_num = total_page
15     except Exception as e:
16         # 当输入的页码不是数字的时候,默认返回第一页
17         page_num = 1
18 
19     data_start = (page_num-1)*10
20     data_end = (page_num)*10
21 
22     # 页面上总共展示多少页码
23     max_page = 11
24     half_max_page = max_page //2
25 
26     # 页面展示的页面从哪开始
27     page_start = page_num - half_max_page
28     page_end = page_num + half_max_page
29     if page_start <= 1:
30         page_start = 1
31         page_end = max_page + 1
32 
33     # 如果当前页加上一半 比总页码数还大
34     if page_end >= total_page:
35         page_end = total_page
36         page_start = total_page - max_page
37 
38     # 每一页取10个值
39     all_book = models.Book.objects.all()[data_start:data_end]
40 
41     # 自己拼接分页的html代码
42     html_str_list = []
43     # 加上第一页
44     html_str_list.append(<li><a href="/books/?page=1">第一页</li>)
45 
46     # 加上上一页
47     if page_num <= 1:
48         html_str_list.append(<li class="disabled"><a href="#"><span aria-hidden="true">&laquo;</span></a></li>)
49     else:
50 
51         html_str_list.append(<li><a href="/books/?page={}"><span aria-hidden="true">&laquo;</span></a></li>.format(page_num-1))
52 
53     for i in range(page_start, page_end):
54         # 如果是当前页就加一个active样式
55         if i == page_num:
56             tmp = <li class="active"><a href="/books/?page={0}">{0}</li>.format(i)
57         else:
58             tmp = <li><a href="/books/?page={0}">{0}</li>.format(i)
59         html_str_list.append(tmp)
60     # 加上下一页
61     if page_num >= total_page:
62         html_str_list.append(<li class="disabled"><a href="#"><span aria-hidden="true">&raquo;</span></a></li>)
63     else:
64         html_str_list.append(<li><a href="/books/?page={}"><span aria-hidden="true">&raquo;</span></a></li>.format(page_num+1))
65     # 加上最后一页
66 
67     html_str_list.append(<li><a href="/books/?page={}">尾页</li>.format(total_page))
68 
69     page_html = ‘‘.join(html_str_list)
70 
71     return render(request, books.html, {books: all_book, page_html: page_html})
未封装的代码.py

2.divmod

>>>divmod(22, 3)
>>>(7, 1)

>>>divmod(20, 2)
>>>(10, 0)

>>>divmod(23, 2)
>>>(11, 1)

3.‘/‘ 和 ‘//‘ 的返回值

>>>10/2
>>>5.0  # 浮点数

>>>10//2
>>>5  # 整数

>>>abs(-10)
>>>10  # 绝对值

4.ORM是对象,有索引值

>>>models.Book.objects.all()  # QuerySet对象
>>>models.Book.objects.all()[0: 3]  #可以根据索引取值

5.上一页和下一页图标

&laquo  # 上一页 <<

&raquo  # 下一页 >>

6.url参数传到后台的类型是str

7.list转为str

>>>li = [1, 2, 3, 4, 5]
>>>new_li = ‘‘.join(li)
>>>new_li
>>>12345

>>>new_li =  .join(li)
>>>new_li
>>>1 2 3 4 5

 

以上是关于django分页设计并封装的主要内容,如果未能解决你的问题,请参考以下文章

13.django之分页

Django—分页器与form组件

django通用分页封装

Django自定义分页器

自定义分页器

自定义分页器