SidindelningLink to this heading

Django tillhandahåller hög- och lågnivåmetoder för att hjälpa dig att hantera paginerad data - det vill säga data som är uppdelad på flera sidor, med ”Föregående/Nästa”-länkar.

Klassen ”PaginatorLink to this heading

Under huven använder alla metoder för paginering Paginator-klassen. Den gör allt det tunga arbetet med att faktiskt dela upp en QuerySet i Page-objekt.

ExempelLink to this heading

Ge Paginator en lista med objekt, plus det antal objekt du vill ha på varje sida, så ger den dig metoder för att komma åt objekten för varje sida:

Python console
>>> 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'>
>>> 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

Paginering av en ListViewLink to this heading

django.views.generic.list.ListView tillhandahåller ett inbyggt sätt att paginera den visade listan. Du kan göra detta genom att lägga till ett paginate_by-attribut till din vyklass, till exempel:

Code
from django.views.generic import ListView

from myapp.models import Contact


class ContactListView(ListView):
    paginate_by = 2
    model = Contact

Detta begränsar antalet objekt per sida och lägger till en paginator och page_obj till context. För att tillåta dina användare att navigera mellan sidor, lägg till länkar till nästa och föregående sida, i din mall så här:

Django template
{% for contact in page_obj %}
    {# Each "contact" is a Contact model object. #}
    {{ contact.full_name|upper }}<br>
    ...
{% endfor %}

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

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

        {% if page_obj.has_next %}
            <a href="?page={{ page_obj.next_page_number }}">next</a>
            <a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
        {% endif %}
    </span>
</div>

Använda Paginator i en vyfunktionLink to this heading

Här är ett exempel där Paginator används i en vyfunktion för att paginera en frågeuppsättning:

Code
from django.core.paginator import Paginator
from django.shortcuts import render

from myapp.models import Contact


def listing(request):
    contact_list = Contact.objects.all()
    paginator = Paginator(contact_list, 25)  # Show 25 contacts per page.

    page_number = request.GET.get("page")
    page_obj = paginator.get_page(page_number)
    return render(request, "list.html", {"page_obj": page_obj})

I mallen list.html kan du inkludera navigering mellan sidor på samma sätt som i mallen för ListView ovan.