summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell Keith-Magee <russell@keith-magee.com>2007-09-14 01:01:02 +0000
committerRussell Keith-Magee <russell@keith-magee.com>2007-09-14 01:01:02 +0000
commit87e77ffca0a7df59ff9407ef30a2baa90f1d872d (patch)
tree94a098a50cb4a2b1cb68da3e94f6564e2b9caf4e
parentcb9db449380d80f1e5856e64fd7cde15da63a315 (diff)
downloaddjango-87e77ffca0a7df59ff9407ef30a2baa90f1d872d.tar.gz
Fixed #1795 -- Added page_range to paginators in generic list views. Thanks to polarcowz@gmail.com and Marc Fargas <telenieko@telenieko.com> for the patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@6146 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/core/paginator.py11
-rw-r--r--django/views/generic/list_detail.py3
-rw-r--r--docs/generic_views.txt9
-rw-r--r--tests/modeltests/pagination/models.py4
4 files changed, 26 insertions, 1 deletions
diff --git a/django/core/paginator.py b/django/core/paginator.py
index 380808a3dd..b50ca826c4 100644
--- a/django/core/paginator.py
+++ b/django/core/paginator.py
@@ -20,6 +20,7 @@ class ObjectPaginator(object):
self.num_per_page = num_per_page
self.orphans = orphans
self._hits = self._pages = None
+ self._page_range = None
def validate_page_number(self, page_number):
try:
@@ -83,6 +84,16 @@ class ObjectPaginator(object):
hits = 0
self._pages = hits // self.num_per_page + 1
return self._pages
+
+ def _get_page_range(self):
+ """
+ Returns a 1-based range of pages for iterating through within
+ a template for loop.
+ """
+ if self._page_range is None:
+ self._page_range = range(1, self._pages + 1)
+ return self._page_range
hits = property(_get_hits)
pages = property(_get_pages)
+ page_range = property(_get_page_range)
diff --git a/django/views/generic/list_detail.py b/django/views/generic/list_detail.py
index f5616b9745..c4a8cd3e05 100644
--- a/django/views/generic/list_detail.py
+++ b/django/views/generic/list_detail.py
@@ -39,6 +39,8 @@ def object_list(request, queryset, paginate_by=None, page=None,
first_on_page
the result number of the first object in the
object_list (1-indexed)
+ page_range:
+ A list of the page numbers (1-indexed).
"""
if extra_context is None: extra_context = {}
queryset = queryset._clone()
@@ -67,6 +69,7 @@ def object_list(request, queryset, paginate_by=None, page=None,
'first_on_page': paginator.first_on_page(page - 1),
'pages': paginator.pages,
'hits' : paginator.hits,
+ 'page_range' : paginator.page_range
}, context_processors)
else:
c = RequestContext(request, {
diff --git a/docs/generic_views.txt b/docs/generic_views.txt
index 0601aead11..96635f7d3f 100644
--- a/docs/generic_views.txt
+++ b/docs/generic_views.txt
@@ -765,6 +765,9 @@ If the results are paginated, the context will contain these extra variables:
* ``hits``: The total number of objects across *all* pages, not just this
page.
+ * ``page_range``: A list of the page numbers that are available. This
+ is 1-based.
+
Notes on pagination
~~~~~~~~~~~~~~~~~~~
@@ -781,7 +784,11 @@ specify the page number in the URL in one of two ways:
/objects/?page=3
-In both cases, ``page`` is 1-based, not 0-based, so the first page would be
+ * To loop over all the available page numbers, use the ``page_range``
+ variable. You can iterate over the list provided by ``page_range``
+ to create a link to every page of results.
+
+These values and lists are is 1-based, not 0-based, so the first page would be
represented as page ``1``.
``django.views.generic.list_detail.object_detail``
diff --git a/tests/modeltests/pagination/models.py b/tests/modeltests/pagination/models.py
index a7af2a7089..1dcec00a32 100644
--- a/tests/modeltests/pagination/models.py
+++ b/tests/modeltests/pagination/models.py
@@ -77,4 +77,8 @@ True
>>> paginator = ObjectPaginator(Article.objects.all(), 10, orphans=1)
>>> paginator.pages
2
+
+# The paginator can provide a list of all available pages
+>>> paginator.page_range
+[1, 2]
"""}