经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Django » 查看文章
Django框架实现的分页demo示例
来源:jb51  时间:2019/5/27 8:33:33  对本文有异议

本文实例讲述了Django框架实现的分页。分享给大家供大家参考,具体如下:

首先初始化model,建表

  1. class Book(models.Model):
  2. name = models.CharField(max_length=20)
  3. def __str__(self):
  4. return self.name
  5. class Meta:
  6. db_table = 'books'
  7.  

然后用pycharm的数据库模块可视化插入

分页思路

url传递参数http://127.0.0.1:8000/books/?page=5比如这样传递的参数就是5,就显示第五页,

1.get到所有图书对象

2.计算好每一页应该有几个数据

3.根据不同的page值传递

  1. def books(request):
  2. #取从url传递的参数
  3. page_num = request.GET.get('page')
  4. page_num = int(page_num)
  5. start = (page_num-1)*5
  6. end = page_num*5
  7. #总页码数是?
  8. per_page = 5
  9. total = models.Book.objects.all().count()
  10. total,more =divmod(total,per_page)
  11. if more:
  12. total+=1
  13. all_books = models.Book.objects.all()[start:end]
  14. #自己拼接分页的html代码
  15. html_str_list = []
  16. for i in range(1,total):
  17. tmp = '<li><a href="/books/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{}</li>'.format(i,i)
  18. html_str_list.append(tmp)
  19. page_html = "".join(html_str_list)
  20. return render(request,'books.html',{'books':all_books,'total_page':total,'page_html':page_html})
  21.  

拿到数据总量的值,每一页的数量为5,如果有余数则total+1也就是增加一个页面.

建立一个列表,去拼接a标签,最后传递给前端

前端

前端的样式用到了boottrap,可以直接看文档.

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>书记列表</title>
  6. <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css" rel="external nofollow" >
  7. </head>
  8. <body>
  9. <div class="container">
  10. <table class="table table-bordered">
  11. <thead>
  12. <tr>
  13. <th>序号</th>
  14. <th>id</th>
  15. <th>书名</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. <li>
  31. <a href="#" rel="external nofollow" rel="external nofollow" aria-label="Previous">
  32. <span aria-hidden="true">«</span>
  33. </a>
  34. </li>
  35. {{ page_html|safe }}
  36. <li>
  37. <a href="#" rel="external nofollow" rel="external nofollow" aria-label="Next">
  38. <span aria-hidden="true">»</span>
  39. </a>
  40. </li>
  41. </ul>
  42. </nav>
  43. </div>
  44. </body>
  45. </html>
  46.  
  1. {{ page_html|safe }}
  2.  

传递过来的page_html要用safe过滤器,不然无法转移成html.

最终效果

分页优化

设置一个首页一个尾页,以及显示局部的页面

  1. def books(request):
  2. # 取从url传递的参数
  3. page_num = request.GET.get('page')
  4. page_num = int(page_num)
  5. start = (page_num - 1) * 5
  6. end = page_num * 5
  7. # 总页码数是?
  8. per_page = 5
  9. # 页面上总共展示多少页面
  10. max_page = 11
  11. half_max_page = max_page // 2
  12. # 页面上展示的页面从哪开始
  13. page_start = page_num - half_max_page
  14. if page_start <= 1:
  15. page_start = 1
  16. total = models.Book.objects.all().count()
  17. # 页面到哪结束
  18. page_end = page_num+half_max_page
  19. if page_end > total:
  20. page_end = total
  21. page_start = total - max_page
  22. total, more = divmod(total, per_page)
  23. if more:
  24. total += 1
  25. all_books = models.Book.objects.all()[start:end]
  26. # 自己拼接分页的html代码
  27. html_str_list = []
  28. html_str_list.append('<li><a href="/books/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >首页</li>'.format(1,1))
  29. for i in range(page_start, page_end+1):
  30. tmp = '<li><a href="/books/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >{}</li>'.format(i, i)
  31. html_str_list.append(tmp)
  32. html_str_list.append('<li><a href="/books/?page={}" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >最后一页</li>'.format(total))
  33. page_html = "".join(html_str_list)
  34. return render(request, 'books.html', {'books': all_books, 'total_page': total, 'page_html': page_html})
  35.  

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号