Django有自帶的分頁器,能夠將數據分在不一樣的頁面中,並提供一些屬性和方法實現對分頁數據的操做。分頁功能的類位於django/core/paginator.py中。css
# 分頁器 # paginator分頁器對象(obj,每頁條數) paginator = Paginator(book_list, 3) ################經常使用方法################# print("count:", paginator.count) # 數據總數 print("num_pages", paginator.num_pages) # 總頁數 print("page_range", paginator.page_range) # 頁碼的列表 #################提取某一頁具體數據的兩種方式################# # 方式1 page1 = paginator.page(1) # 第1頁的page對象 for i in page1: # 遍歷第1頁的全部數據對象 print(i) # 方式2 print(page1.object_list) # 第1頁的全部數據
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <h3>圖書列表</h3> <ul> {% for book_obj in current_page %} <li>{{ book_obj.title }}:{{ book_obj.price }}</li> {% endfor %} </ul> <nav aria-label="Page navigation"> <ul class="pagination"> {# 上一頁#} {% if current_page.has_previous %} <li> <a href="?page={{ current_page.previous_page_number }}" aria-label="Previous"> <span aria-hidden="true">上一頁</span> </a> </li> {% else %} {# 若是沒有上一頁了,就把標籤禁止,且沒有鏈接#} <li class="disabled"> <a href="" aria-label="Previous"> <span aria-hidden="true">上一頁</span> </a> </li> {% endif %} {# 中間的頁碼#} {% for page in page_range %} {# 若是循環的頁碼等於當前的頁碼,就添加active#} {% if current_page_num == page%} <li class="active"><a href="?page={{ page }}">{{ page }}</a></li> {% else %} <li><a href="?page={{ page }}">{{ page }}</a></li> {% endif %} {% endfor %} {# 下一頁#} {% if current_page.has_next %} <li> <a href="?page={{ current_page.next_page_number }}" aria-label="Next"> <span aria-hidden="true">下一頁</span> </a> </li> {% else %} {# 若是沒有下一頁了,就把標籤禁止,且沒有鏈接#} <li class="disabled"> <a href="" aria-label="Next"> <span aria-hidden="true">下一頁</span> </a> </li> {% endif %} </ul> </nav> </body> </html>
from django.shortcuts import render from app01.models import * from django.core.paginator import Paginator # Create your views here. def index(request): """ 批量導入數據到數據庫 book_list=[] for i in range(100): book=Book(title="book%s"%i,price=i*i) book_list.append(book) Book.objects.bulk_create(book_list) :param request: :return: """ # 拿到全部的數據書籍 book_obj_list = Book.objects.all() # 生成分頁器對象 paginator = Paginator(book_obj_list, 3) # 獲取瀏覽器端請求的頁碼,須要設置默認值 current_page_num = int(request.GET.get('page', 1)) # 當前頁的全部書對象 current_page = paginator.page(current_page_num) # 頁碼列表,可迭代 # 分頁過多,須要用條件判斷顯示的頁碼 if paginator.num_pages > 11: # 11就是顯示的固定個數 if current_page_num - 5 < 1: # 接近最小頁碼時,固定頁碼,不然會出現負數 page_range = range(1, 12) elif current_page_num + 5 > paginator.num_pages: # 接近最大頁碼時,根據最大頁碼限制頁碼數,不然會出現不存在的頁碼 page_range = range(paginator.num_pages - 10, paginator.num_pages + 1) else: page_range = range(current_page_num - 5, current_page_num + 6) # 其餘狀況,顯示當前的挨着的幾個 else: page_range = paginator.page_range # 頁碼總數不足時,顯示所有,即不會超寬 return render(request, 'index.html', locals())