Skip to content

Commit

Permalink
Fixed #9215 -- Added a view/template example of using pagination.
Browse files Browse the repository at this point in the history
Based on a patch from shacker and Matt Dennenbaum.


git-svn-id: http://code.djangoproject.com/svn/django/trunk@9193 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
malcolmt committed Oct 7, 2008
1 parent 08c3ad0 commit 72f387d
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 26 deletions.
1 change: 1 addition & 0 deletions AUTHORS
Expand Up @@ -107,6 +107,7 @@ answer newbie questions, and generally made Django that much better:
Jason Davies (Esaj) <http://www.jasondavies.com/>
Richard Davies <richard.davies@elastichosts.com>
Alex Dedul
Matt Dennenbaum
deric@monowerks.com
Max Derkachev <mderk@yandex.ru>
Rajesh Dhawan <rajesh.dhawan@gmail.com>
Expand Down
109 changes: 83 additions & 26 deletions docs/topics/pagination.txt
Expand Up @@ -75,6 +75,63 @@ page::
objects such as Django's ``QuerySet`` to use a more efficient ``count()``
method when available.


Using ``Paginator`` in a view
==============================

Here's a slightly more complex example using :class:`Paginator` in a view to
paginate a queryset. We give both the view and the accompanying template to
show how you can display the results. This example assumes you have a
``Contacts`` model that has already been imported.

The view function looks like this::

from django.core.paginator import Paginator, InvalidPage, EmptyPage

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

# Make sure page request is an int. If not, deliver first page.
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = 1

# If page request (9999) is out of range, deliver last page of results.
try:
contacts = paginator.page(page)
except (EmptyPage, InvalidPage):
contacts = paginator.page(paginator.num_pages)

return render_to_response('list.html', {"contacts": contacts})

In the template :file:`list.html`, you'll want to include navigation between
pages along with any interesting information from the objects themselves::

{% for contact in contacts.object_list %}
{# 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>


``Paginator`` objects
=====================

Expand Down Expand Up @@ -114,32 +171,32 @@ Methods
-------

.. method:: Paginator.page(number)

Returns a :class:`Page` object with the given 1-based index. Raises
:exc:`InvalidPage` if the given page number doesn't exist.

Attributes
----------

.. attribute:: Paginator.count

The total number of objects, across all pages.
.. note::

.. note::

When determining the number of objects contained in ``object_list``,
``Paginator`` will first try calling ``object_list.count()``. If
``object_list`` has no ``count()`` method, then ``Paginator`` will
fallback to using ``object_list.__len__()``. This allows objects, such
as Django's ``QuerySet``, to use a more efficient ``count()`` method
when available.

.. attribute:: Paginator.num_pages

The total number of pages.

.. attribute:: Paginator.page_range

A 1-based range of page numbers, e.g., ``[1, 2, 3, 4]``.

``InvalidPage`` exceptions
Expand Down Expand Up @@ -174,36 +231,36 @@ Methods
-------

.. method:: Page.has_next()

Returns ``True`` if there's a next page.

.. method:: Page.has_previous()

Returns ``True`` if there's a previous page.

.. method:: Page.has_other_pages()

Returns ``True`` if there's a next *or* previous page.

.. method:: Page.next_page_number()

Returns the next page number. Note that this is "dumb" and will return the
next page number regardless of whether a subsequent page exists.

.. method:: Page.previous_page_number()

Returns the previous page number. Note that this is "dumb" and will return
the previous page number regardless of whether a previous page exists.

.. method:: Page.start_index()

Returns the 1-based index of the first object on the page, relative to all
of the objects in the paginator's list. For example, when paginating a list
of 5 objects with 2 objects per page, the second page's :meth:`~Page.start_index`
would return ``3``.

.. method:: Page.end_index()

Returns the 1-based index of the last object on the page, relative to all of
the objects in the paginator's list. For example, when paginating a list of
5 objects with 2 objects per page, the second page's :meth:`~Page.end_index`
Expand All @@ -213,14 +270,14 @@ Attributes
----------

.. attribute:: Page.object_list

The list of objects on this page.

.. attribute:: Page.number

The 1-based page number for this page.

.. attribute:: Page.paginator

The associated :class:`Paginator` object.

0 comments on commit 72f387d

Please sign in to comment.