Django[进阶篇 - 1 ]
分页
一, Django 内置分页
- from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
- objects = ['john','paul','george','ringo','lucy','meiry','checy','wind','flow','rain']
- p = Paginator(objects,3) # 3 条数据为一页, 实例化分页对象
- print(p.count) # 10 对象总共 10 个元素
- print(p.num_pages) # 4 对象可分 4 页
- print(p.page_range) # range(1, 5) 对象页的可迭代范围, 即页码为 1,2,3,4
- page1 = p.page(1) # 取对象的第一分页对象
- print(page1.object_list) # 第一分页对象的元素列表 ['john', 'paul', 'george']
- print(page1.number) # 第一分页对象的当前页值 1
- #
- page2 = p.page(2) # 取对象的第二分页对象
- print(page2.object_list) # 第二分页对象的元素列表 ['ringo', 'lucy', 'meiry']
- print(page2.number) # 第二分页对象的当前页码值 2
- print('当前第一页是否有上一页',page1.has_previous()) # # 第一分页对象是否有前一页 False
- print('当前第一页是否有其他页',page1.has_other_pages()) # # 第一分页对象是否有其它页 Trueprint(page2.has_previous()) # # 第二分页对象是否有前一页 True
- print(page2.has_next()) # # 第二分页对象是否有下一页 True
- print(page2.next_page_number()) # # 第二分页对象下一页码的值 3
- print(page2.previous_page_number()) # # 第二分页对象的上一页码值 1
- print(page2.start_index()) # # 第二分页对象的元素开始索引 4(索引从 1 开始)
- print(page2.end_index()) # # 第 2 分页对象的元素结束索引 6
- from django.shortcuts import render
- from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
- L = []
- for i in range(999):
- L.append(i)
- def index(request):
- current_page = request.GET.get('p')
- paginator = Paginator(L, 10)
- # per_page: 每页显示条目数量
- # count: 数据总个数
- # num_pages: 总页数
- # page_range: 总页数的索引范围, 如: (1,10),(1,200)
- # page: page 对象
- try:
- posts = paginator.page(current_page)
- # has_next 是否有下一页
- # next_page_number 下一页页码
- # has_previous 是否有上一页
- # previous_page_number 上一页页码
- # object_list 分页之后的数据列表
- # number 当前页
- # paginator paginator 对象
- except PageNotAnInteger:
- posts = paginator.page(1)
- except EmptyPage:
- posts = paginator.page(paginator.num_pages)
- return render(request, 'index.html', {'posts': posts})
views.py
Views.py
- <!DOCTYPE HTML>
- <HTML>
- <head lang="en">
- <meta charset="UTF-8">
- <title>
- </title>
- </head>
- <body>
- <ul>
- {% for item in posts %}
- <li>
- {{ item }}
- </li>
- {% endfor %}
- </ul>
- <div class="pagination">
- <span class="step-links">
- {% if posts.has_previous %}
- <a href="?p={{ posts.previous_page_number }}">
- Previous
- </a>
- {% endif %}
- <span class="current">
- Page {{ posts.number }} of {{ posts.paginator.num_pages }}.
- </span>
- {% if posts.has_next %}
- <a href="?p={{ posts.next_page_number }}">
- Next
- </a>
- {% endif %}
- </span>
- </div>
- </body>
- </HTML>
HTML
- from django.shortcuts import render
- from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
- class CustomPaginator(Paginator):
- def __init__(self, current_page, max_pager_num, *args, **kwargs):
- """
- :param current_page: 当前页
- :param max_pager_num: 最多显示的页码个数
- :param args:
- :param kwargs:
- :return:
- """
- self.current_page = int(current_page)
- self.max_pager_num = max_pager_num
- super(CustomPaginator, self).__init__(*args, **kwargs)
- def page_num_range(self):
- # 当前页面
- # self.current_page
- # 总页数
- # self.num_pages
- # 最多显示的页码个数
- # self.max_pager_num
- print(1)
- if self.num_pages <self.max_pager_num:
- return range(1, self.num_pages + 1)
- print(2)
- part = int(self.max_pager_num / 2)
- if self.current_page - part < 1:
- return range(1, self.max_pager_num + 1)
- print(3)
- if self.current_page + part> self.num_pages:
- return range(self.num_pages + 1 - self.max_pager_num, self.num_pages + 1)
- print(4)
- return range(self.current_page - part, self.current_page + part + 1)
- L = []
- for i in range(999):
- L.append(i)
- def index(request):
- current_page = request.GET.get('p')
- paginator = CustomPaginator(current_page, 11, L, 10)
- # per_page: 每页显示条目数量
- # count: 数据总个数
- # num_pages: 总页数
- # page_range: 总页数的索引范围, 如: (1,10),(1,200)
- # page: page 对象
- try:
- posts = paginator.page(current_page)
- # has_next 是否有下一页
- # next_page_number 下一页页码
- # has_previous 是否有上一页
- # previous_page_number 上一页页码
- # object_list 分页之后的数据列表
- # number 当前页
- # paginator paginator 对象
- except PageNotAnInteger:
- posts = paginator.page(1)
- except EmptyPage:
- posts = paginator.page(paginator.num_pages)
- return render(request, 'index.html', {'posts': posts})
扩展内置分页: view.py
- <!DOCTYPE HTML>
- <HTML>
- <head lang="en">
- <meta charset="UTF-8">
- <title>
- </title>
- </head>
- <body>
- <ul>
- {% for item in posts %}
- <li>
- {{ item }}
- </li>
- {% endfor %}
- </ul>
- <div class="pagination">
- <span class="step-links">
- {% if posts.has_previous %}
- <a href="?p={{ posts.previous_page_number }}">
- Previous
- </a>
- {% endif %} {% for i in posts.paginator.page_num_range %}
- <a href="?p={{ i }}">
- {{ i }}
- </a>
- {% endfor %} {% if posts.has_next %}
- <a href="?p={{ posts.next_page_number }}">
- Next
- </a>
- {% endif %}
- </span>
- <span class="current">
- Page {{ posts.number }} of {{ posts.paginator.num_pages }}.
- </span>
- </div>
- </body>
- </HTML>
扩展内置分页: HTML
二, 自定义分页
分页功能在每个网站都是必要的, 对于分页来说, 其实就是根据用户的输入计算出应该在数据库表中的起始位置.
1, 设定每页显示数据条数
2, 用户输入页码 (第一页, 第二页...)
3, 根据设定的每页显示条数和当前页码, 计算出需要取数据表的起始位置
4, 在数据表中根据起始位置取值, 页面上输出数据
需求又来了, 需要在页面上显示分页的页面. 如:[上一页][1][2][3][4][5][下一页]
1, 设定每页显示数据条数
2, 用户输入页码 (第一页, 第二页...)
3, 设定显示多少页号
4, 获取当前数据总条数
5, 根据设定显示多少页号和数据总条数计算出, 总页数
6, 根据设定的每页显示条数和当前页码, 计算出需要取数据表的起始位置
7, 在数据表中根据起始位置取值, 页面上输出数据
8, 输出分页 HTML, 如:[上一页][1][2][3][4][5][下一页]
总结, 分页时需要做三件事:
创建处理分页数据的类
根据分页数据获取数据
输出分页 HTML, 即:[上一页][1][2][3][4][5][下一页]
来源: http://www.bubuko.com/infodetail-2988082.html