Django自带分页

  1. from django.core.paginator import Paginator, Page
  2. users = models.UserInfo.objects.all()
  3. paginator = Paginator(users, 10)
  4. """
  5. per_pate: 每页显示条目数量
  6. count: 数据总个数
  7. num_pages: 总页数
  8. page_range:总页数的索引范围
  9. page: page对象
  10. """
  11. posts = paginator.page(current_page) # current_page 当前页的页数
  12. """
  13. has_next 是否有下一页
  14. next_page_number 下一页页码
  15. has_previous 是否有上一页
  16. previous_page_number 上一页页码
  17. object_list 当前页的数据
  18. number 当前页
  19. paginator paginator对象
  20. """
  21. return render('usres.html', {'posts': posts})

自定义分页

  1. class PageInfo:
  2. def __init__(self, current_page, all_count, per_page, base_url, show_page=9):
  3. """
  4. :param current_page: 当前页数
  5. :param all_count: 数据库总行数
  6. :param per_page: 每页显示行数
  7. :param base_url: 基础url
  8. :param show_page: 最多显示页码个数
  9. """
  10. try:
  11. self.current_page = int(current_page)
  12. except Exception as e:
  13. self.current_page = 1
  14. self.all_count = all_count
  15. self.per_apge = per_page
  16. self.all_page, n2 = divmod(self.all_count, self.per_apge)
  17. if n2 > 0:
  18. self.all_page += 1
  19. self.show_page = show_page
  20. self.base_url = base_url
  21. @property
  22. def start(self):
  23. """
  24. 当前页数据库起始位置
  25. :return:
  26. """
  27. return (self.current_page - 1) * self.per_apge
  28. @property
  29. def end(self):
  30. """
  31. 当前页数据库结束位置
  32. :return:
  33. """
  34. return self.current_page * self.per_apge
  35. def pager(self):
  36. page_list = []
  37. # 计算显示页号的起始页号和终止页号
  38. if self.all_page <= self.show_page:
  39. # 当总页数小于要显示的页数
  40. page_start = 1
  41. page_end = self.all_page + 1
  42. else: # 总页数大于要显示的页数
  43. half = (self.show_page-1) // 2 # 当前页在中间时前后显示的页的数量
  44. if self.current_page <= half:
  45. # 当前页小于中间位置时 起始页为1 终止页为show_page
  46. page_start = 1
  47. page_end = self.show_page + 1
  48. elif self.current_page+half > self.all_page:
  49. # 当前页+右边显示数量 > 总页数是
  50. page_end = self.all_page + 1
  51. page_start = page_end - self.show_page
  52. else:
  53. page_start = self.current_page - half
  54. page_end = self.current_page + half + 1
  55. # 上一页按钮
  56. if self.current_page > 1:
  57. home = "<li><a href='%s?page=1'>首页</a></li>" % self.base_url
  58. prev = "<li><a href='%s?page=%s'>上一页</a></li>" % (self.base_url, self.current_page-1)
  59. else:
  60. home = "<li class='disabled'><a>首页</a></li>"
  61. prev = "<li class='disabled'><a>上一页</a></li>"
  62. page_list.append(home)
  63. page_list.append(prev)
  64. # 页码显示
  65. for i in range(page_start, page_end):
  66. if i == self.current_page:
  67. temp = "<li class='active'><a>%s</a></li>" % i
  68. else:
  69. temp = "<li><a href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i)
  70. page_list.append(temp)
  71. # 下一页
  72. if self.current_page < self.all_page:
  73. nex = "<li><a href='%s?page=%s'>下一页</a></li>" % (self.base_url, self.current_page+1)
  74. trailer = "<li><a href='%s?page=%s'>尾页</a></li>" % (self.base_url, self.all_page)
  75. else:
  76. nex = "<li class='disabled'><a>下一页</a></li>"
  77. trailer = "<li class='disabled'><a>尾页</a></li>"
  78. page_list.append(nex)
  79. page_list.append(trailer)
  80. return ''.join(page_list)