Django做爲Python Web開發框架的一哥,提供了企業級網站開發所須要的幾乎全部功能,其中就包括自帶分頁功能。利用Django自帶的Paginator類,咱們能夠很輕鬆地實現分頁。Django 2.0和1.X最大的不一樣在於新增了get_page()方法。咱們如今來具體看看有什麼不一樣。html
利用Django實現分類很是簡單,咱們只須要修改views.py和模板template。Django 1.X下實現分頁代碼以下:django
# app/views.py - 基於函數的視圖
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from .models import Article
from django.shortcuts import render
def article_list(request):
article_list = Article.objects.all()
paginator = Paginator(article_list, 10) # 實例化一個分頁對象, 每頁顯示10個
page = request.GET.get('page') # 從URL經過get頁碼,如?page=3
try:
articles = paginator.page(page) # 獲取某頁對應的記錄
except PageNotAnInteger: # 若是頁碼不是個整數
articles = paginator.page(1) # 提取第一頁的記錄
except EmptyPage: # 若是頁碼太大,沒有相應的記錄
articles = paginator.page(paginator.num_pages) # 提取最後一頁的記錄
return render(request, 'article_list.html', {'articles': articles})
複製代碼
你注意到沒有?上段代碼的try和2個except很是重要,可是看上去有些冗餘。Django 2.0下新增了get_page()方法,能夠將代碼大大簡化(以下圖所示)。它所實現的功能與上面是同樣的。當用戶提交的頁碼不是整數時,提取第一頁記錄。當用戶輸入的頁碼太大時,只提取最後一頁記錄。bash
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from .models import Article
from django.shortcuts import render
def article_list(request):
article_list = Article.objects.all()
paginator = Paginator(article_list, 10) # 實例化一個分頁對象, 每頁顯示10個
page = request.GET.get('page') # 從URL經過get頁碼,如?page=3
articles = paginator.get_page(page) # 獲取某頁對應的記錄, 若是
return render(request, 'article_list.html', {'articles': articles})
複製代碼
Django 1.X和2.0下的模板是同樣的。這裏提供兩種顯示方案。app
模板二: Page 1, 2, 3, 4, 5, 6, 7, 8, ... (推薦)
#app/templates/app/article_list.html
# Pagination style 2
{% for article in articles %}
{{ article.title }}
{% endfor %}
<div class="pagination">
<nav>
<ul class="pagination">
{% if articles.has_previous %}
<li class="">
<a href="?page={{ articles.previous_page_number }}" aria-label="Previous">
<span aria_hidden="true">«</span></a>
</li>
{% endif %}
{% for page_num in articles.paginator.page_range %}
{% if page_num == articles.number %}
<li class="active"><a href="?page={{ page_num }}">{{page_num}}</a> </li>
{% else %}
<li class=""><a href="?page={{ page_num }}">{{page_num}}</a> </li>
{% endif %}
{% endfor %}
{% if articles.has_next %}
<li class="">
<a href="?page={{ articles.next_page_number }}" aria-label="Next">
<span aria_hidden="true">»</span></a>
</li>
{% endif %}
</ul>
</nav>
</div>
複製代碼