當網頁資料太多時,把資料拆成一多頁,一次讓使用者只看特定數量的資料是很常見的做法,這個做法叫做分頁(Pagination)。
Django 對分頁非常友善,它有內建一個類別就叫 Pagination
,可以直將所有物件基於選擇數量,拆分成好幾組。接著我們只需要以 URL 的 QueryString 給定的參數來決定要回復哪一組即可。
from django.core.paginator import Paginator
# 假定我有一個 QuerySet 叫做 qs
# items_count: 一頁中要有幾個物件
items_count = 5
p = Paginator(qs, items_count)
# 自己設定 URL 的 QueryString 參數叫做 page
page_number = request.GET.get("page")
paginated_qs = p.get_page(page_number)
# 把 paginated_qs 丟進 template 即可
return render(request, "exmple.html", {"paginated_qs":paginated_qs})
在 Django Template 的部分,簡單跑個迴圈,並設定前一頁、後一頁的按鈕即可。
(程式有用 tailwind/daisy 排版)
<ul class="join flex justify-center gap-2">
{% if pages.has_previous %}
<li>
<a class="join-item btn" href="?page={{pages.previous_page_number}}">
« 上一頁
</a>
</li>
{% endif %}
{% 顯示現在頁面 %}
<li class="join-item btn">
第{{pages.number}}頁
</li>
{% if pages.has_next %}
<li>
<a class="join-item btn" href="?page={{pages.next_page_number}}">
下一頁 »
</a>
</li>
{% endif %}
</ul>