Django之分頁功能

Django提供了一個新的類來幫助你管理分頁數據,這個類存放在django/core/paginator.py.它能夠接收列表、元組或其它可迭代的對象。html

基本語法

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

……

 

基本語法實例

#!/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']
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

 

 官方解釋

在視圖中的應用

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模板中的應用

{% 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>

 

舉例講述分頁功能的使用

目的說明

  現要實現以下功能python

    一、網頁上顯示分頁數據,3條數據爲一頁git

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

    三、若是沒有上一頁或下一頁,則不出現箭頭導航django

    四、若是最後一頁的數據少於2條,合併到上一頁app

效果圖

  圖1:函數

 

  圖2:優化

 

視圖定義

 

 定義templates

 

 

分頁功能優化

目標:spa

  一、在template中的html模板中使用自定義函數code

  二、無論有多少分頁,頁面上最多顯示5頁

 

基礎知識

Django的模板語言包含了各類各樣的內置標籤和過濾器來知足你的應用需求,不過有時候你也會發現你的須要的功能不在內置的功能中,這時候你能夠經過Python語言自定義標籤和過濾器來擴展模板引擎,而後在你的模板中使用{% load %}來加載使用它們。

在你的app下建立templatetags包,在其下建立python腳原本定義你的標籤和過濾器,如:

polls/
    __init__.py
    models.py
    templatetags/
        __init__.py
        poll_extras.py
    views.py

 

而後在你的模板中使用

{% load poll_extras %}

 

項目實戰

自定義過濾器和標籤

 

在模板中引用

 

效果圖:

 

 

 項目工程包路徑:

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

相關文章
相關標籤/搜索