文章目錄
- 0.思路引導
- 1.Paginator 類的常用方法
- 2.用 Paginator 給文章列表分頁
- 3.在模板中設置分頁導航
- 4.效果展示
0.思路引導
1)當博客上發布的文章越來越多時,通常需要進行分頁顯示,以免所有的文章都堆積在一個頁面,影響用戶體驗。
2)Django 內置的 Pagination 能夠幫助我們實現簡單的分頁功能
1.Paginator 類的常用方法
分頁功能由 Django 內置的 Paginator 類提供,這個類位于 django.core.paginator 模塊,需要使用它時,只需在適當的地方導入即可:
from django.core.paginator import Paginator
使用時需實例化一個 Paginator 對象,并在實例化時傳入一個需要分頁的列表對象,就可以得到分頁后的對象。
# 對 item_list 進行分頁,每頁包含 2 個數據。
>>> item_list = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(item_list, 2)
具體的使用請查看官方文檔
2.用 Paginator 給文章列表分頁
Django 的官方文檔中給出了一個在視圖函數中對列表進行分頁的示例,下面的視圖函數獲取一個聯系人列表并對其分頁:
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import renderdef listing(request):contact_list = Contacts.objects.all()paginator = Paginator(contact_list, 25) # 每頁顯示 25 個聯系人page = request.GET.get('page')try:contacts = paginator.page(page)except PageNotAnInteger:# 如果用戶請求的頁碼號不是整數,顯示第一頁contacts = paginator.page(1)except EmptyPage:# 如果用戶請求的頁碼號超過了最大頁碼號,顯示最后一頁contacts = paginator.page(paginator.num_pages)return render(request, 'list.html', {'contacts': contacts})
這就是在視圖函數中使用分頁的代碼邏輯,你可以把它當做一個模板應用于自己的任何需要分頁的視圖函數。
不過在我們的博客項目中,我們已將視圖函數轉換成了類視圖。而類視圖 ListView 已經幫我們寫好了上述的分頁邏輯,我們只需通過指定 paginate_by 屬性來開啟分頁功能即可,即在類視圖中指定 paginate_by 屬性的值:
文件位置:blog/views.py
class IndexView(ListView):model = Posttemplate_name = 'blog/index.html'context_object_name = 'post_list'# 指定 paginate_by 屬性后開啟分頁功能,其值代表每一頁包含多少篇文章paginate_by = 10
這里我們設置了每 10 篇文章一頁。
3.在模板中設置分頁導航
接下來便是在模板中設置分頁導航,比如上一頁、下一頁的按鈕,以及顯示一些頁面信息。
ListView 傳遞了以下和分頁有關的模板變量供我們在模板中使用:
- paginator ,即 Paginator 的實例。
- page_obj ,當前請求頁面分頁對象。
- is_paginated,是否已分頁。只有當分頁后頁面超過兩頁時才算已分頁。
- object_list,請求頁面的對象列表,和 post_list 等價。所以在模板中循環文章列表時可以選 post_list ,也可以選
object_list。
文件位置:templates/blog/index.html
{% if is_paginated %}
<div class="pagination-simple"><!-- 如果當前頁還有上一頁,顯示一個上一頁的按鈕 -->{% if page_obj.has_previous %}<a href="?page={{ page_obj.previous_page_number }}">上一頁</a>{% endif %}<!-- 顯示當前頁面信息 --><span class="current">第 {{ page_obj.number }} 頁 / 共 {{ paginator.num_pages }} 頁</span><!-- 如果當前頁還有下一頁,顯示一個下一頁的按鈕 -->{% if page_obj.has_next %}<a href="?page={{ page_obj.next_page_number }}">下一頁</a>{% endif %}
</div>
{% endif %}
另外需要注意的是,請求目的頁,是通過 page 查詢參數傳遞給 django 視圖,django 會根據 page 的值返回對應頁面的文章列表,所以上一頁和下一頁超鏈接的 href 屬性指向的 url 帶上了 page 查詢參數。