Django之分頁功能

lm_y發表於2017-08-31

Django之分頁功能

Django提供了一個新的類來幫助你管理分頁資料,這個類存放在django/core/paginator.py.它可以接收列表、元組或其它可迭代的物件。

基本語法

1
2
3
4
5
6
7
8
9
10
class Paginator(object):
 
    def __init__(self, object_list, per_page, orphans=0,
                 allow_empty_first_page=True):
        self.object_list = object_list
        self.per_page = int(per_page)
        self.orphans = int(orphans)
        self.allow_empty_first_page = allow_empty_first_page
 
……

 

基本語法例項

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
 
import os
 
from django.core.paginator import Paginator
objects = ['john','paul','george','ringo','lucy','meiry','checy','wind','flow','rain']<br>
p = Paginator(objects,3)  # 3條資料為一頁,例項化分頁物件
print p.count  # 10 物件總共10個元素
print p.num_pages  # 4 物件可分4頁
print p.page_range  # xrange(1, 5) 物件頁的可迭代範圍
 
page1 = p.page(1)  # 取物件的第一分頁物件
print page1.object_list  # 第一分頁物件的元素列表['john''paul''george']
print page1.number  # 第一分頁物件的當前頁值 1
 
page2 = p.page(2)  # 取物件的第二分頁物件
print page2.object_list  # 第二分頁物件的元素列表 ['ringo''lucy''meiry']
print page2.number  # 第二分頁物件的當前頁碼值 2
 
print page1.has_previous()  # 第一分頁物件是否有前一頁 False
print page1.has_other_pages()  # 第一分頁物件是否有其它頁 True
 
print page2.has_previous()  # 第二分頁物件是否有前一頁 True
print page2.has_next()  # 第二分頁物件是否有下一頁 True
print page2.next_page_number()  # 第二分頁物件下一頁碼的值 3
print page2.previous_page_number()  # 第二分頁物件的上一頁碼值 1
print page2.start_index()  # 第二分頁物件的元素開始索引 4
print page2.end_index()  # 第2分頁物件的元素結束索引 6

 

 官方解釋

在檢視中的應用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render
 
def listing(request):
    contact_list = Contacts.objects.all()
    paginator = Paginator(contact_list, 25) # Show 25 contacts per page
 
    page = request.GET.get('page')
    try:
        contacts = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        contacts = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        contacts = paginator.page(paginator.num_pages)
 
    return render(request, 'list.html', {'contacts': contacts})

 

在template的html模板中的應用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
{% for contact in contacts %}
    {# Each "contact" is a Contact model object. #}
    {{ contact.full_name|upper }}<br />
    ...
{% endfor %}
 
<div class="pagination">
    <span class="step-links">
        {% if contacts.has_previous %}
            <a href="?page={{ contacts.previous_page_number }}">previous</a>
        {% endif %}
 
        <span class="current">
            Page {{ contacts.number }} of {{ contacts.paginator.num_pages }}.
        </span>
 
        {% if contacts.has_next %}
            <a href="?page={{ contacts.next_page_number }}">next</a>
        {% endif %}
    </span>
</div>

 

舉例講述分頁功能的使用

目的說明

  現要實現如下功能

    1、網頁上顯示分頁資料,3條資料為一頁

    2、有分頁導航功能,被選中頁高亮顯示

    3、如果沒有上一頁或下一頁,則不出現箭頭導航

    4、如果最後一頁的資料少於2條,合併到上一頁

效果圖

  圖1:

 

  圖2:

 

檢視定義

 

 定義templates

 

 

分頁功能優化

目標:

  1、在template中的html模板中使用自定義函式

  2、不管有多少分頁,頁面上最多顯示5頁

 

基礎知識

Django的模板語言包含了各種各樣的內建標籤和過濾器來滿足你的應用需求,不過有時候你也會發現你的需要的功能不在內建的功能中,這時候你可以通過Python語言自定義標籤和過濾器來擴充套件模板引擎,然後在你的模板中使用{% load %}來載入使用它們。

在你的app下建立templatetags包,在其下建立python指令碼來定義你的標籤和過濾器,如:

1
2
3
4
5
6
7
polls/
    __init__.py
    models.py
    templatetags/
        __init__.py
        poll_extras.py
    views.py

 

然後在你的模板中使用

1
{% load poll_extras %}

 

專案實戰

自定義過濾器和標籤

 

在模板中引用

 

效果圖:

 

 

 專案工程包路徑:

 https://github.com/kongzhagen/python/tree/master/Django

相關文章