django 1.x和2.0下的分頁

Django做爲Python Web開發框架的一哥,提供了企業級網站開發所須要的幾乎全部功能,其中就包括自帶分頁功能。利用Django自帶的Paginator類,咱們能夠很輕鬆地實現分頁。Django 2.0和1.X最大的不一樣在於新增了get_page()方法。咱們如今來具體看看有什麼不一樣。html

Django 1.X 和Django 2.0下實現分頁

利用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">&laquo;</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">&raquo;</span></a>
        </li>
      {% endif %}
    </ul>
</nav>
</div>
複製代碼
相關文章
相關標籤/搜索