3.Django分頁

Alpaca_發表於2018-05-14

###文章僅供學習使用,有問題歡迎指出

最近一直在想如何去為自己的部落格網站分頁,很高興的是Django自帶一個分頁的系統

他叫Pagination

官方文件

https://docs.djangoproject.com/zh-hans/2.0/topics/pagination/

Paginaion的應用

在使用Pagination時我們要從Django的包中引入

From django.core.paginator import Paginator,EmptyPage,PageNotAnInteger

以下內容截自官方文件

>>> from django.core.paginator import Paginator
>>> objects = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(objects, 2)
複製程式碼

通過objects.get.all()我們可以獲取所用的資料,這時我們建立一個Paginator的實力,並對他進行分類

def __init__(self, object_list, per_page, orphans=0,
             allow_empty_first_page=True):
    self.object_list = object_list
    self._check_object_list_is_ordered()
    self.per_page = int(per_page)
    self.orphans = int(orphans)
    self.allow_empty_first_page = allow_empty_first_page
複製程式碼

內建原始碼 object_list是你的列表即資料,per_page按多少分為一頁,all_empty_first_page 是否允許第一頁為空,滿足時報錯。當我們讀取不到任何資料的時候,達到滿足條件

>>> p.count
4
>>> p.num_pages
2
>>> type(p.page_range)
<class 'range_iterator'>
>>> p.page_range
range(1, 3)
複製程式碼

p.count 可分類的資料數量,即['john', 'paul', 'george', 'ringo']

p.num_page 分類之後的頁數

>>> page1 = p.page(1)
>>> page1
<Page 1 of 2>
>>> page1.object_list
['john', 'paul']
複製程式碼

page1 = p.page(1) 此時page1表示第一條資料和第二條資料

同理

page2 =p.page(2)此時page2表示3.4兩行資料

是否具有下一頁page1.has_next()

是否具有上一頁page1.has_previous()

是否還有其它的頁 Page1.has_other_pages()

下一頁的頁碼 Page.nex_page_number()

上一頁的頁碼 page2.previous_page_number()

當前頁最開始的時第幾條資料page2.start_index()

當前頁最後結束的時第幾條資料 page2.end_index()

p.page(0) 當前頁的第0條資料 EmptyPage: That page number is less than 1

p.page(3)當前頁的第三條資料 EmptyPage: That page contains no results

View檢視的編寫

#1.獲取資料 
stu_list =  Student.objects.all()  `
#2.分類 
pagintor = Pagintor(stu_list,5)`
#3.獲取頁面,並且轉換
page = request.GET.get('page') 
stus = paginator.get_page(page)
#4.返回  
return render(request, 'list.html', {'stu': stu})
複製程式碼
{% for stu in stus %}
    ...
{% endfor %}

<div class="pagination">
    <span class="step-links">
        {% if contacts.has_previous %}
            <a href="?page=1">&laquo; first</a>
            <a href="?page={{ stu.previous_page_number }}">previous</a>
        {% endif %}

        <span class="current">
            Page {{ stu.number }} of {{ stu.paginator.num_pages }}.
        </span>

        {% if contacts.has_next %}
            <a href="?page={{ stu.next_page_number }}">next</a>
            <a href="?page={{ stu.paginator.num_pages }}">last &raquo;</a>
        {% endif %}
    </span>
</div>
複製程式碼

更加完善的分頁系統