Django 2.1

Pagination




django

Pagination

Django कुछ कक्षाएं प्रदान करता है जो आपको पृष्ठांकित डेटा को प्रबंधित करने में मदद करती हैं - अर्थात, वह डेटा जो कई पृष्ठों में विभाजित है, "पिछला / अगला" लिंक के साथ। ये वर्ग django/core/paginator.py

उदाहरण

Paginator को ऑब्जेक्ट्स की एक सूची दें, साथ ही प्रत्येक पृष्ठ पर आपके द्वारा पसंद की जाने वाली वस्तुओं की संख्या, और यह आपको प्रत्येक पेज के लिए आइटम एक्सेस करने के तरीके प्रदान करती है:

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

>>> p.count
4
>>> p.num_pages
2
>>> type(p.page_range)
<class 'range_iterator'>
>>> p.page_range
range(1, 3)

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

>>> page2 = p.page(2)
>>> page2.object_list
['george', 'ringo']
>>> page2.has_next()
False
>>> page2.has_previous()
True
>>> page2.has_other_pages()
True
>>> page2.next_page_number()
Traceback (most recent call last):
...
EmptyPage: That page contains no results
>>> page2.previous_page_number()
1
>>> page2.start_index() # The 1-based index of the first item on this page
3
>>> page2.end_index() # The 1-based index of the last item on this page
4

>>> p.page(0)
Traceback (most recent call last):
...
EmptyPage: That page number is less than 1
>>> p.page(3)
Traceback (most recent call last):
...
EmptyPage: That page contains no results

ध्यान दें

ध्यान दें कि आप Paginator एक सूची / ट्यूपल, एक Django QuerySet , या किसी अन्य ऑब्जेक्ट को एक count() या __len__() विधि के साथ दे सकते हैं। पारित ऑब्जेक्ट में निहित वस्तुओं की संख्या का निर्धारण करते समय, Paginator पहले कॉलिंग count() कोशिश करेगा, फिर len() का उपयोग करने के लिए Paginator len() यदि पास की गई ऑब्जेक्ट में कोई count() विधि नहीं है। यह Django के QuerySet जैसी वस्तुओं को उपलब्ध होने पर अधिक कुशल count() पद्धति का उपयोग करने की अनुमति देता है।

एक दृश्य में Paginator का उपयोग करना

यहाँ एक Paginator को Paginator करने के लिए एक दृश्य में Paginator का उपयोग करके थोड़ा अधिक जटिल उदाहरण Paginator गया है। हम यह दिखाने के लिए कि आप परिणाम कैसे प्रदर्शित कर सकते हैं, दोनों साथ-साथ देखने के लिए टेम्पलेट देते हैं। यह उदाहरण मानता है कि आपके पास एक Contacts मॉडल है जो पहले ही आयात किया जा चुका है।

देखने का कार्य इस तरह दिखता है:

from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
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')
    contacts = paginator.get_page(page)
    return render(request, 'list.html', {'contacts': contacts})

टेम्प्लेट list.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=1">&laquo; first</a>
            <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>
            <a href="?page={{ contacts.paginator.num_pages }}">last &raquo;</a>
        {% endif %}
    </span>
</div>

Paginator ऑब्जेक्ट्स

Paginator वर्ग में यह निर्माता है:

class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True) [source]

आवश्यक तर्क

object_list

एक सूची, tuple, QuerySet , या एक count() या __len__() विधि के साथ अन्य स्लाइसेबल ऑब्जेक्ट। सुसंगत पृष्ठांकन के लिए, QuerySet को आदेश दिया जाना चाहिए, जैसे कि एक order_by() क्लॉज के साथ या मॉडल पर डिफ़ॉल्ट ordering साथ।

प्रदर्शन के मुद्दों को बड़ा QuerySet s QuerySet

यदि आप बहुत बड़ी संख्या में आइटम के साथ एक QuerySet का उपयोग कर रहे हैं, तो उच्च डेटाबेस संख्याओं का अनुरोध करना कुछ डेटाबेस पर धीमा हो सकता है, क्योंकि परिणामी LIMIT / OFFSET क्वेरी को OFFSET रिकॉर्ड की संख्या की गणना करने की आवश्यकता होती है जो पृष्ठ संख्या जितनी अधिक होती है। ।

per_page
किसी पृष्ठ पर शामिल करने के लिए अधिकतम आइटम, अनाथों सहित नहीं (नीचे orphans वैकल्पिक तर्क देखें)।

वैकल्पिक तर्क

orphans
जब आप बहुत कम वस्तुओं के साथ अंतिम पृष्ठ नहीं रखना चाहते हैं तो इसका उपयोग करें। यदि अंतिम पृष्ठ में सामान्य रूप से orphans बराबर या उससे कम आइटम होंगे, तो उन वस्तुओं को पिछले पृष्ठ पर जोड़ा जाएगा (जो अंतिम पृष्ठ बन जाता है) स्वयं द्वारा एक पृष्ठ पर वस्तुओं को छोड़ने के बजाय। उदाहरण के लिए, 23 वस्तुओं के साथ, per_page=10 , और orphans=3 , दो पृष्ठ होंगे; पहला पेज जिसमें 10 आइटम हैं और दूसरा (और अंतिम) पेज है जिसमें 13 आइटम हैं। orphans शून्य पर चूक करते हैं, जिसका अर्थ है कि पृष्ठ कभी संयुक्त नहीं होते हैं और अंतिम पृष्ठ में एक आइटम हो सकता है।
allow_empty_first_page
पहले पन्ने को खाली होने दिया जाए या नहीं। यदि False और object_list खाली है, तो एक EmptyPage त्रुटि उठाई जाएगी।

तरीके

Paginator.get_page(number) [source]
Django 2.0 में नया:

दी गई 1-आधारित इंडेक्स के साथ एक Page ऑब्जेक्ट लौटाता है, जबकि सीमा से बाहर और अमान्य पेज नंबर भी संभालता है।

यदि पृष्ठ संख्या नहीं है, तो यह पहला पृष्ठ लौटाता है। यदि पृष्ठ संख्या नकारात्मक है या पृष्ठों की संख्या से अधिक है, तो यह अंतिम पृष्ठ लौटाता है।

यह केवल एक अपवाद ( EmptyPage ) उठाता है यदि आप Paginator(..., allow_empty_first_page=False) निर्दिष्ट करते हैं और Paginator(..., allow_empty_first_page=False) खाली है।

Paginator.page(number) [source]

दिए गए 1-आधारित सूचकांक के साथ एक Page वस्तु लौटाता है। यदि दिए गए पृष्ठ संख्या मौजूद नहीं है, तो InvalidPage है।

गुण

Paginator.count

सभी पृष्ठों पर कुल वस्तुओं की संख्या।

ध्यान दें

ऑब्जेक्ट_लिस्ट में शामिल ऑब्जेक्ट्स की संख्या निर्धारित करते समय, Paginator सबसे पहले ऑब्जेक्ट_ Paginator object_list.count() कॉल करने का प्रयास करेगा। यदि object_list में कोई count() विधि नहीं है, तो Paginator len(object_list) का उपयोग करने के लिए वापस Paginator जाएगा। यह उपलब्ध होने पर अधिक कुशल count() पद्धति का उपयोग करने के लिए, Django के QuerySet जैसी वस्तुओं को अनुमति देता है।

Paginator.num_pages

पृष्ठों की कुल संख्या।

Paginator.page_range

पृष्ठ संख्याओं का 1-आधारित श्रेणी पुनरावृत्ति, जैसे उपज [1, 2, 3, 4]

InvalidPage अपवाद

exception InvalidPage [source]

जब एक पेजिनेटर अमान्य पृष्ठ संख्या पारित किया जाता है तो अपवादों के लिए एक आधार वर्ग।

यदि अनुरोधित पृष्ठ अमान्य है (यानी, पूर्णांक नहीं) या कोई ऑब्जेक्ट नहीं है तो Paginator.page() विधि अपवाद को उठाती है। आम तौर पर, यह InvalidPage अपवाद को पकड़ने के लिए पर्याप्त है, लेकिन यदि आप अधिक ग्रैन्युलैरिटी चाहते हैं, तो आप निम्न अपवादों में से किसी को भी पकड़ सकते हैं:

exception PageNotAnInteger [source]

जब page() को एक ऐसा मान दिया जाता है जो पूर्णांक नहीं होता है।

exception EmptyPage [source]

जब page() को वैध मान दिया जाता है, लेकिन उस पृष्ठ पर कोई वस्तु मौजूद नहीं होती है।

अपवाद के दोनों InvalidPage उपवर्ग हैं, इसलिए आप except InvalidPage एक साधारण से दोनों को संभाल सकते हैं।

Page ऑब्जेक्ट्स

आप आमतौर पर Page ऑब्जेक्ट्स को हाथ से नहीं बनाएंगे - आप उन्हें Paginator.page() का उपयोग करके प्राप्त करेंगे।

class Page(object_list, number, paginator) [source]

एक पृष्ठ, len() का उपयोग करते समय या इसे सीधे पुनरावृत्त करते समय Page.object_list अनुक्रम की तरह कार्य करता है।

तरीके

Page.has_next() [source]

यदि अगला पृष्ठ है तो True

Page.has_previous() [source]

यदि पिछला पृष्ठ है तो True

Page.has_other_pages() [source]

यदि अगला या पिछला पृष्ठ है, तो यह सही है।

Page.next_page_number() [source]

अगला पेज नंबर देता है। यदि अगला पृष्ठ मौजूद नहीं है, तो InvalidPage है।

Page.previous_page_number() [source]

पिछला पृष्ठ क्रमांक लौटाता है। यदि पिछले पृष्ठ मौजूद नहीं है, तो InvalidPage है।

Page.start_index() [source]

पृष्ठ पर पहले ऑब्जेक्ट का 1-आधारित इंडेक्स लौटाता है, जो पेजिनेटर की सूची की सभी वस्तुओं के सापेक्ष है। उदाहरण के लिए, जब प्रति पृष्ठ 2 वस्तुओं के साथ 5 वस्तुओं की सूची तैयार की जाती है, तो दूसरे पृष्ठ का start_index() 3 वापस आ जाएगा।

Page.end_index() [source]

पृष्ठ पर अंतिम ऑब्जेक्ट का 1-आधारित इंडेक्स लौटाता है, जो पेजिनेटर की सूची की सभी वस्तुओं के सापेक्ष है। उदाहरण के लिए, प्रति पृष्ठ 2 वस्तुओं के साथ 5 ऑब्जेक्ट्स की सूची को पृष्ठांकित करते समय, दूसरे पृष्ठ का end_index() 4 वापस आ जाएगा।

गुण

Page.object_list

इस पृष्ठ पर वस्तुओं की सूची।

Page.number

इस पृष्ठ के लिए 1-आधारित पृष्ठ संख्या।

Page.paginator

संबंधित Paginator वस्तु।