自定义分页

未封装版:

  • 优点:直观
  • 缺点:代码乱,不易维护,可拓展性差
  1. data = []
  2.  
  3. for i in range(1, 302):
  4. tmp = {"id": i, "name": "alex-{}".format(i)}
  5. data.append(tmp)
  6.  
  7. print(data)
  8.  
  9. def user_list(request):
  10.  
  11. # user_list = data[0:10]
  12. # user_list = data[10:20]
  13. try:
  14. current_page = int(request.GET.get("page"))
  15. except Exception as e:
  16. current_page = 1
  17.  
  18. per_page = 10
  19.  
  20. # 数据总条数
  21. total_count = len(data)
  22. # 总页码
  23. total_page, more = divmod(total_count, per_page)
  24. if more:
  25. total_page += 1
  26.  
  27. # 页面最多显示多少个页码
  28. max_show = 11
  29. half_show = int((max_show-1)/2)
  30.  
  31. if current_page <= half_show:
  32. show_start = 1
  33. show_end = max_show
  34. else:
  35. if current_page + half_show >= total_page:
  36. show_start = total_page - max_show
  37. show_end = total_page
  38. else:
  39. show_start = current_page - half_show
  40. show_end = current_page + half_show
  41.  
  42. # 数据库中获取数据
  43. data_start = (current_page - 1) * per_page
  44. data_end = current_page * per_page
  45.  
  46. user_list = data[data_start:data_end]
  47.  
  48. # 生成页面上显示的页码
  49. page_html_list = []
  50. # 加首页
  51. first_li = '<li><a href="/user_list/?page=1">首页</a></li>'
  52. page_html_list.append(first_li)
  53. # 加上一页
  54. if current_page == 1:
  55. prev_li = '<li><a href="#">上一页</a></li>'
  56. else:
  57. prev_li = '<li><a href="/user_list/?page={}">上一页</a></li>'.format(current_page - 1)
  58. page_html_list.append(prev_li)
  59. for i in range(show_start, show_end+1):
  60. if i == current_page:
  61. li_tag = '<li class="active"><a href="/user_list/?page={0}">{0}</a></li>'.format(i)
  62. else:
  63. li_tag = '<li><a href="/user_list/?page={0}">{0}</a></li>'.format(i)
  64. page_html_list.append(li_tag)
  65.  
  66. # 加下一页
  67. if current_page == total_page:
  68. next_li = '<li><a href="#">下一页</a></li>'
  69. else:
  70. next_li = '<li><a href="/user_list/?page={}">下一页</a></li>'.format(current_page+1)
  71. page_html_list.append(next_li)
  72.  
  73. # 加尾页
  74. page_end_li = '<li><a href="/user_list/?page={}">尾页</a></li>'.format(total_page)
  75. page_html_list.append(page_end_li)
  76.  
  77. page_html = "".join(page_html_list)
  78.  
  79. return render(request, "user_list.html", {"user_list": user_list, "page_html": page_html})

  

封装版:

  • 优点:易维护、可拓展性强
  • 缺点:逻辑相对复杂
  1. """
  2. 自定义分页组件
  3. """
  4. class Pagination(object):
  5.  
  6. def __init__(self, data_num, current_page, url_prefix, per_page=10, max_show=11):
  7. """
  8. 进行初始化.
  9. :param data_num: 数据总数
  10. :param current_page: 当前页
  11. :param url_prefix: 生成的页码的链接前缀
  12. :param per_page: 每页显示多少条数据
  13. :param max_show: 页面最多显示多少个页码
  14. """
  15. self.data_num = data_num
  16. self.per_page = per_page
  17. self.max_show = max_show
  18. self.url_prefix = url_prefix
  19.  
  20. # 把页码数算出来
  21. self.page_num, more = divmod(data_num, per_page)
  22. if more:
  23. self.page_num += 1
  24.  
  25. try:
  26. self.current_page = int(current_page)
  27. except Exception as e:
  28. self.current_page = 1
  29. # 如果URL传过来的页码数是负数
  30. if self.current_page <= 0:
  31. self.current_page = 1
  32. # 如果URL传过来的页码数超过了最大页码数
  33. elif self.current_page > self.page_num:
  34. self.current_page = self.page_num # 默认展示最后一页
  35.  
  36. # 页码数的一半 算出来
  37. self.half_show = max_show // 2
  38.  
  39. # 页码最左边显示多少
  40. if self.current_page - self.half_show <= 1:
  41. self.page_start = 1
  42. self.page_end = self.max_show
  43. elif self.current_page + self.half_show >= self.page_num: # 如果右边越界
  44. self.page_end = self.page_num
  45. self.page_start = self.page_num - self.max_show
  46. else:
  47. self.page_start = self.current_page - self.half_show
  48. # 页码最右边显示
  49. self.page_end = self.current_page + self.half_show
  50.  
  51. if self.page_num < self.page_end:
  52. self.page_end = self.page_num # 如果总页面小于结束页面,那么结束页面即为总页码
  53.  
  54. @property
  55. def start(self):
  56. # 数据从哪儿开始切
  57. return (self.current_page - 1) * self.per_page
  58.  
  59. @property
  60. def end(self):
  61. # 数据切片切到哪儿
  62. return self.current_page * self.per_page
  63.  
  64. def page_html(self):
  65. # 生成页码
  66. l = []
  67. # 加一个首页
  68. l.append('<li><a href="{}?page=1">首页</a></li>'.format(self.url_prefix))
  69. # 加一个上一页
  70. if self.current_page == 1:
  71. l.append('<li class="disabled" ><a href="#">«</a></li>'.format(self.current_page))
  72. else:
  73. l.append('<li><a href="{}?page={}">«</a></li>'.format(self.url_prefix, self.current_page - 1))
  74.  
  75. for i in range(self.page_start, self.page_end + 1):
  76.  
  77. if i == self.current_page:
  78. tmp = '<li class="active"><a href="{0}?page={1}">{1}</a></li>'.format(self.url_prefix, i)
  79. else:
  80. tmp = '<li><a href="{0}?page={1}">{1}</a></li>'.format(self.url_prefix, i)
  81. l.append(tmp)
  82.  
  83. # 加一个下一页
  84. if self.current_page == self.page_num:
  85. l.append('<li class="disabled"><a href="#">»</a></li>'.format(self.current_page))
  86. else:
  87. l.append('<li><a href="{}?page={}">»</a></li>'.format(self.url_prefix, self.current_page + 1))
  88. # 加一个尾页
  89. l.append('<li><a href="{}?page={}">尾页</a></li>'.format(self.url_prefix, self.page_num))
  90. return "".join(l)

封装版使用步骤:

  1. 将上面的一段代码复制到自定义的模块(pt文件)中
  2. 导入自定义模块
  3. 在views系统的函数里写入以下代码
    1. def user_list(request):
    2. # 实例化一个分页类的对象
    3. obj = Pagination(blogs.count(),page,'blogs.html')
    4. # 根据传入的总博客数、页码获取当页需要展示的博客
    5. blog_list = blogs[obj.start:obj.end]
    6. # 根据传入的博客数及页码获取生成分页的html格式的页码列表
    7. page_html = pager.page_html()
    8. #返回指定页面
    9. return render(request, "blog_list.html", {"blog_list": blog_list, "page_html": page_html})

      

  4. 在需要生成页面的html页面写入以下代码
    1. <div class="topicListFooter fenye">
    2. <ul class="pagination">
    3. {{ page_html|safe }}
    4. </ul>
    5. </div>

      注:示例中用的是bootstrap分页样式

Django中的内置分页(不能展示页码列表)

  1. from django.shortcuts import render
  2. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  3.  
  4. L = []
  5. for i in range(999):
  6. L.append(i)
  7.  
  8. def index(request):
  9. current_page = request.GET.get('p')
  10.  
  11. paginator = Paginator(L, 10)
  12. # per_page: 每页显示条目数量
  13. # count: 数据总个数
  14. # num_pages:总页数
  15. # page_range:总页数的索引范围,如: (1,10),(1,200)
  16. # page: page对象
  17. try:
  18. posts = paginator.page(current_page)
  19. # has_next 是否有下一页
  20. # next_page_number 下一页页码
  21. # has_previous 是否有上一页
  22. # previous_page_number 上一页页码
  23. # object_list 分页之后的数据列表
  24. # number 当前页
  25. # paginator paginator对象
  26. except PageNotAnInteger:
  27. posts = paginator.page(1)
  28. except EmptyPage:
  29. posts = paginator.page(paginator.num_pages)
  30. return render(request, 'index.html', {'posts': posts})
  31.  
  32. 内置分页view部分

  

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <ul>
  9. {% for item in posts %}
  10. <li>{{ item }}</li>
  11. {% endfor %}
  12. </ul>
  13.  
  14. <div class="pagination">
  15. <span class="step-links">
  16. {% if posts.has_previous %}
  17. <a href="?p={{ posts.previous_page_number }}">Previous</a>
  18. {% endif %}
  19. <span class="current">
  20. Page {{ posts.number }} of {{ posts.paginator.num_pages }}.
  21. </span>
  22. {% if posts.has_next %}
  23. <a href="?p={{ posts.next_page_number }}">Next</a>
  24. {% endif %}
  25. </span>
  26.  
  27. </div>
  28. </body>
  29. </html>
  30.  
  31. 内置分页HTML部分

  

 
 
 
 

Django项目实战—分页的更多相关文章

  1. Django项目实战之用户上传与访问

    1 将文件保存到服务器本地 upload.html <!DOCTYPE html> <html lang="en"> <head> <me ...

  2. Django项目实战之用户头像上传与访问

      1 将文件保存到服务器本地 upload.html <!DOCTYPE html> <html lang="en"> <head> < ...

  3. 跟老齐学Django 项目实战笔记

    创建项目 mysite 创建应用 blog mysit/settings.py配置app INSTALLED_APPS = [ 'django.contrib.admin', 'django.cont ...

  4. Django项目实战—用户头像上传

    1 将文件保存到服务器本地 upload.html <!DOCTYPE html> <html lang="en"> <head> <me ...

  5. Django项目实战 - 搜索功能(转)

    首先,前端已实现搜索功能页面, 我们直接写后台逻辑: Q()可以实现 逻辑或的判断,   name_ _ icontains 表示 name字段包含搜索的内容,i表示忽略大小写. from djang ...

  6. Django项目实战 - html中用户登录判断

    实现逻辑: {% if request.user.is_authenticated %} 个人信息{% else %}登录{% endif %} 直接上代码 {% if request.user.is ...

  7. 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程

    点击了解更多Python课程>>> 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程 适用人群: 即将毕业的大学生,工资低工作重的白领,渴望崭露头角的职场新人, ...

  8. web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 ☝☝☝

    web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程    web前端Vue+Django rest framework 框架 生鲜电商项目实战视频教程 学习 ...

  9. Python Django CMDB项目实战之-3创建form表单,并在前端页面上展示

    基于之前的项目代码 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页.index页.文章页面 Python Django CMDB项目实战之-2创建APP. ...

随机推荐

  1. node.js运行内存堆溢出的解决办法

    我是在将一组80多列13万多行的数据通过node-xlsx的时候出现的内存堆溢出的情况. 解决办法时将: node app.js 改成: node --max_old_space_size=10000 ...

  2. Bootstrap, 模态框实现值传递,自动勾选

    目录 Bootstrap,模态框自动勾选,值传递 1.父页面 2. 子页面(modal) 模态框 Bootstrap,模态框自动勾选,值传递 场景: ​ 有一个这样的需求, 在父页面有一个table, ...

  3. DB2分页

    前言 最近在做一个DB2的项目,遇到分页处理的设计时开始犯难.以前一直采用MySQL作为项目数据库,其中的Limit关键字非常人性化,MySQL把分页的处理逻辑封装到了数据库的核心中,使得做查询设计时 ...

  4. SQL Server 学习之环境搭建

    SQL Server 环境搭建 说明:本文是sqlServer的安装和测试环境的搭建 版本是SQLServer 2005版,由于该版本只能在Windows7或者更低的系统上才能安装,更高的系统请安装S ...

  5. 【LOJ】#3101. 「JSOI2019」精准预测

    LOJ#3101. 「JSOI2019」精准预测 设0是生,1是死,按2-sat连边那么第一种情况是\((t,x,1) \rightarrow (t + 1,y,1)\),\((t + 1,y, 0) ...

  6. Codeforces Round #590 (Div. 3)补题

    要想上2000分,先刷几百道2000+的题再说 ---某神 题目 E F 赛时是否尝试 × × tag math bitmask 难度 2000 2400 状态 ∅ √ 解 E 待定 F 传送门 第一 ...

  7. 第7章:LeetCode--算法:递归问题

    70. Climbing Stairs This problem is a Fibonacci problem.F(n)=F(n-1)+F(n-2);Solving this problem by r ...

  8. MySQL优化 - 性能分析与查询优化(转)

    出处:  MySQL优化 - 性能分析与查询优化 优化应贯穿整个产品开发周期中,比如编写复杂SQL时查看执行计划,安装MySQL服务器时尽量合理配置(见过太多完全使用默认配置安装的情况),根据应用负载 ...

  9. Earth Wind and Fire CodeForces - 1148E (构造)

    大意: $n$个石子, 第$i$个石子初始位置$s_i$, 每次操作选两个石子$i,j$, 要求$s_i<s_j$, 任取$d$, 满足$0\le 2d\le s_j-s_i$, 将$s_i,s ...

  10. Spring Boot(一) 初步理解Spring Boot

    一.Spring Boot所解决的问题 Java开发十分笨重:繁多的配置.低下的开发效率.复杂的部署流程以头疼的第三方技术集成. Spring Boot的理念:习惯优于配置——项目中存在大量的配置,此 ...