我們先在 shell 中演示分頁器的用法:
# 引入分頁器模塊
from django.core.paginator import Paginator
objects = ['john', 'paul', 'george', 'ringo']
# 對 objects 對象進行分頁比藻,每頁2個對象
p = Paginator(objects, 2)
# 對象總數(shù)
p.count
>>> 4
# 總頁數(shù)
p.num_pages
>>> 2
# 獲取某頁的對象
page1 = p.page(1)
page2 = p.page(2)
page1
>>> <Page 1 of 2>
# 第一頁的對象列表
page1.object_list
>>> ['john', 'paul']
# 判斷是否存在下一頁
page1.has_next()
>>> True
page2.has_next()
>>> False
# 判斷是否存在上一頁
page2.has_previous()
>>> Trus
page1.has_previous()
>>> Flase
# 判斷是否存在其他頁
page1.has_other_pages()
>>> True
# 下一頁的頁碼
page1.next_page_number()
>>> 2
# 如果下一頁不存在合陵,會報錯
page2.next_page_number()
>>> Traceback (most recent call last):
...
raise EmptyPage('That page contains no results')
# 上一頁頁碼
page2.previous_page_number()
>>> 1
# 某頁對象索引
page2.start_index() # 第2頁第一個對象的索引(從1開始)
>>> 3
page2.end_index() # The 1-based index of the last item on this page
>>> 4
分頁器示例
現(xiàn)在我們在 view 中使用分頁器:
from django.shortcuts import render
# 分頁器扇住,空白頁,頁面不存在三個模塊
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from myApp.models import Beatles
def test(request):
context = {}
beatles_list = Beatles.objects.all()
# 分頁器涤姊,對 beatles_list 進行分頁操作箱季,每頁顯示2個對象
paginator = Paginator(beatles_list, 2)
# get 方法獲取頁數(shù)
page = request.GET.get('page')
try: # 獲取某頁
beatles_list = paginator.page(page)
except PageNotAnInteger: # 如果 page 參數(shù)不為正整數(shù),顯示第一頁
beatles_list = paginator.page(1)
except EmptyPage: # 如果 page 參數(shù)為空頁砚作,跳到最后一頁
beatles_list = paginator.page(paginator.num_pages)
context['beatles_list'] = beatles_list
return render(request, 'test.html', context)
瀏覽器打開:http://127.0.0.1:8000/test/?page=1 懂扼,能看到第一頁的禁荸,再打開:http://127.0.0.1:8000/test/?page=2 右蒲,顯示的就是第二頁信息阀湿。
我們再編輯下前端,做一個上下頁的按鈕:
<body>
{% for member in beatles_list %}
{{ member }}
<br><br>
{% endfor %}
<br><br>
{# 存在上一頁 #}
{% if beatles_list.has_previous %}
<a href="?page={{ beatles_list.previous_page_number}}">上一頁</a>
{% endif %}
{# 存在下一頁 #}
{% if beatles_list.has_next %}
<a href="?page={{ beatles_list.next_page_number}}">下一頁</a>
{% endif %}
</body>
分頁器對象
分頁器參數(shù)
class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)
object_list: 要進行分頁的對象瑰妄,可以是列表陷嘴、元組、QuerySet 或其他具有
count()
或__len__()
方法的對象间坐。per_page: 每一頁的對象數(shù)量
orphans: 頁面對象數(shù)量不得少于該數(shù)量灾挨。舉個例子邑退,有12個對象,每頁顯示5個劳澄,默認
orphans=0
的時候將會分成3頁地技,第1第2頁各有5個對象,第3頁2個對象秒拔;當設置orphans=2
時候莫矗,頁面不能少于2個對象,這時對象會被分成2頁砂缩,第1頁有5個對象作谚,第2頁有7個對象。allow_empty_first_page: 是否允許第一頁為空
分頁器屬性:
Paginator.count: 所有頁面的對象總數(shù)庵芭。
Paginator.num_pages:頁面總數(shù)妹懒。
Paginator.page_range:頁碼的范圍,返回一個 range 對象双吆,從1開始眨唬。
Page 對象
Page 的方法:
Page.has_next(): 如果有下一頁,則返回 True好乐。
Page.has_previous(): 如果有上一頁单绑,返回 True。
Page.has_other_pages(): 如果有上一頁或下一頁曹宴,返回 True搂橙。
Page.next_page_number(): 返回下一頁的頁碼。如果下一頁不存在笛坦,拋出 InvalidPage 異常区转。
Page.previous_page_number(): 返回上一頁的頁碼。如果上一頁不存在版扩,拋出 InvalidPage 異常废离。
Page.start_index(): 返回當前頁上的第一個對象,相對于分頁列表的所有對象的序號礁芦,從1開始蜻韭。比如,將五個對象的列表分為每頁兩個對象柿扣,第二頁的 start_index() 會返回3肖方。
Page.end_index(): 返回當前頁上的最后一個對象,相對于分頁列表的所有對象的序號未状,從1開始俯画。 比如,將五個對象的列表分為每頁兩個對象司草,第二頁的 end_index() 會返回 4艰垂。
Page屬性:
Page.object_list: 當前頁上所有對象的列表泡仗。
Page.number: 當前頁的序號,從1開始猜憎。
Page.paginator: 相關的Paginator對象娩怎。