分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该显示在页面上的数据在数据库表中的起始位置。

确定分页需求:

1. 每页显示的数据条数
2. 每页显示页号链接数
3. 上一页和下一页
4. 首页和末页

效果图:

首先,利用django内置的分页功能,写分页类:

 1 from django.core.paginator import Paginator, Page      # 导入django分页模块
 2
 3
 4 class PageInfo(object):
 5     def __init__(self, current_page, all_count, base_url, per_page=10, show_page=11):
 6         """
 7
 8         :param current_page: 当前页
 9         :param all_count: 总页数
10         :param base_url: 模板
11         :param per_page: 每页显示数据条数
12         :param show_page: 显示链接页个数
13         """
14         #若url错误,默认显示第一页(错误类型可能为:空页面编号,非整数型页面编号)
15         try:
16             self.current_page = int(current_page)
17         except Exception as e:
18             self.current_page = 1
19
20         #根据数据库信息条数得出总页数
21         a, b = divmod(all_count, per_page)
22         if b:
23             a += 1
24         self.all_page = a
25
26         self.base_url = base_url
27         self.per_page = per_page
28         self.show_page = show_page
29
30     #当前页起始数据id
31     def start_data(self):
32         return (self.current_page - 1) * self.per_page
33
34     #当前页结束数据id
35     def end_data(self):
36         return self.current_page * self.per_page
37
38     #动态生成前端html
39     def pager(self):
40         page_list = []
41         half = int((self.show_page - 1)/2)
42         #如果:总页数 < show_page,默认显示页数范围为: 1~总页数
43         if self.all_page < self.show_page:
44             start_page = 1
45             end_page = self.all_page + 1
46         #如果:总页数 > show_page
47         else:
48             #如果:current_page - half <= 0,默认显示页数范围为:1~show_page
49             if self.current_page <= half:
50                 start_page = 1
51                 end_page = self.show_page + 1
52             else:
53                 #如果:current_page + half >总页数,默认显示页数范围为:总页数 - show_page ~ 总页数
54                 if self.current_page + half > self.all_page:
55                     end_page = self.all_page + 1
56                     start_page = end_page - self.show_page
57                 else:
58                     start_page = self.current_page - half
59                     end_page = self.current_page + half + 1
60
61         #首页
62         first_page = "<li><a href='%s?page=%s'>首页</a></li>" %(self.base_url, 1)
63         page_list.append(first_page)
64
65         #上一页(若当前页等于第一页,则上一页无链接,否则链接为当前页减1)
66         if self.current_page <= 1:
67             prev_page = "<li><a href='#'>上一页</a></li>"
68         else:
69             prev_page = "<li><a href='%s?page=%s'>上一页</a></li>" %(self.base_url, self.current_page-1)
70         page_list.append(prev_page)
71
72         #动态生成中间页数链接
73         for i in range(start_page, end_page):
74             if i == self.current_page:
75                 temp = "<li class='active'><a href='%s?page=%s'>%s</a></li>" %(self.base_url, i, i)
76             else:
77                 temp = "<li><a href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i)
78             page_list.append(temp)
79
80         #下一页(若当前页等于最后页,则下一页无链接,否则链接为当前页加1)
81         if self.current_page >= self.all_page:
82             next_page = "<li><a href='#'>下一页</a></li>"
83         else:
84             next_page = "<li><a href='%s?page=%s'>下一页</a></li>" %(self.base_url, self.current_page+1)
85         page_list.append(next_page)
86
87         #末页(若总页数只有一页,则无末页标签)
88         if self.all_page > 1:
89             last_page = "<li><a href='%s?page=%s'>末页</a></li>" % (self.base_url, self.all_page)
90             page_list.append(last_page)
91
92         return ''.join(page_list)

然后,在views中写方法(此处写在app01中):

1 from utils.pagnition import PageInfo    # 从文件中导入上步自定义的分页模块
2
3 def custom(request):
4     all_count = models.UserInfo.objects.all().count()   # 获取要显示数据库的总数据条数
5     page_info = PageInfo(request.GET.get('page'), all_count, '/custom.html/',)      # 生成分页对象
6     user_list = models.UserInfo.objects.all()[page_info.start_data():page_info.end_data()]      # 利用分页对象获取当前页显示数据
7     return render(request, 'custom.html', {'user_list': user_list, 'page_info': page_info})     # 模板渲染

然后,在templates目录下写“custom.html"文件:

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>customers</title>
 6 {#    引入bootstrap样式#}
 7     <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
 8 </head>
 9 <body>
10 <h1>customers</h1>
11 {#当前页显示的数据#}
12 <ul>
13     {% for row in user_list %}
14         <li>{{ row.name }}</li>
15     {% endfor %}
16 </ul>
17
18 {#分页#}
19     <nav aria-label="Page navigation">
20       <ul class="pagination">
21 {#                传入page_info.pager#}
22           {{ page_info.pager|safe }}
23       </ul>
24     </nav>
25
26 </body>
27 </html>

最后,新增url关系(urls.py):

1 from django.conf.urls import url
2 from django.contrib import admin
3 from app01 import views as app01_views
4
5 urlpatterns = [
6     url(r'^custom.html/$', app01_views.custom),
7 ]

至此,就完成了利用django的分页功能自定义分页模块,可以应用在不同的业务页面上。

参考资料:

1. Python之路【第十七篇】:Django【进阶篇 】

转载于:https://www.cnblogs.com/OldJack/p/7081486.html

Django—自定义分页相关推荐

  1. Django框架详细介绍---cookie、session、自定义分页

    1.cookie 在HTTP协议介绍中提到,该协议是无状态的,也就是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的 ...

  2. Django 分页组件替换自定义分页

    Django的分页器(paginator) 总之不太好用我们还是用自己的好一些 自定义分页器 分页实现源码 """ 自定义分页组件 """c ...

  3. python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页)...

    python 全栈开发,Day87(ajax登录示例,CSRF跨站请求伪造,Django的中间件,自定义分页) 一.ajax登录示例 新建项目login_ajax 修改urls.py,增加路径 fro ...

  4. Django 基础(12)-Django drf 分页查询(批量查询)、自定义分页器

    文章目录 Django drf 分页查询(批量查询) PageNumberPagination:普通分页 Django 自定义分页器 自定义批量查询的返回结构 LimitOffsetPaginatio ...

  5. 自定义分页(模块化)

    自定义分页 1.目的&环境准备 目的把分页写成一个模块的方式然后在需要分页的地方直接调用模块就行了. 环境准备Django中生成一个APP并且注册,配置URL&Views 配置URL ...

  6. 自定义分页模板(银角大王版)

    阅读目录 当数据库中数据有很多,我们通常会在前端页面做分页展示. 分页的数据可以在前端页面实现,也可以在后端实现分页. 后端实现分页的原理就是每次只请求一页数据. 准备工作 我们使用脚本批量创建一些测 ...

  7. Python自定义分页组件

    为了防止XSS即跨站脚本攻击,需要加上 safe # 路由 from django.conf.urls import url from django.contrib import admin from ...

  8. python 换页_Python之路【第十九篇】自定义分页实现(模块化)

    自定义分页 1.目的&环境准备 目的把分页写成一个模块的方式然后在需要分页的地方直接调用模块就行了. 环境准备Django中生成一个APP并且注册,配置URL&Views 配置URL ...

  9. Cookie、Session和自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

最新文章

  1. Windows Server 2008R2使用web方式修改域账户密码
  2. 小程序 data-***自定义
  3. 用gdb调试core文件
  4. iOS开发学习-nonatomic和atomic的区别
  5. strcpy和strcat
  6. xp的服务器系统怎么安装win7系统教程,怎么在xp系统下安装win7双系统教程
  7. s8050三极管经典电路_电子电路系统的基本概念有哪些?
  8. 关于jquery中html()、text()、val()的区别
  9. App_Code 目录
  10. html中怎么写行内样式,css行内样式是什么?
  11. java微信支付通知接口_java实现微信支付结果通知
  12. UnicodeDecodeError: 'shift_jis' codec can't decode byte 0x93 in position 4: illegal multibyte sequen
  13. 关于多个债权人申请执行同一被执行人的清偿顺序问题
  14. OKHttp源码解析 (复用连接池)
  15. 软件界面原型设计工具(Web):Axure RP
  16. android开发脚本之awk
  17. Linux磁盘无法umount的问题
  18. 手把手教你获得电信公网ipv6
  19. DDS的DXT5格式解析
  20. 计算机系统直流地 哪,长春哪有接地模块检测怎么做热情服务

热门文章

  1. python 列表操作详解,Python列表解析操作实例总结
  2. pytorch_basics Save and load model
  3. python input sys.stdin
  4. java怎么对作者名排序_Java 对象排序详解
  5. vSAN6.2 性能服务
  6. 消息中间件学习总结(19)——生产案例:消息中间件 MQ 如何处理消费失败的消息?
  7. 疯狂软件对Oracle放弃Java EE的看法
  8. Hadoop学习总结(2)——Hadoop入门详解
  9. Java Web学习总结(3)——Servlet详解
  10. vs2008调试c语言,VS2008调试Release程序-Dump文件方式_C/C++技术分享_看流星社区 www.kanliuxing.com...