diff options
author | Russell Keith-Magee <russell@keith-magee.com> | 2007-09-14 01:01:02 +0000 |
---|---|---|
committer | Russell Keith-Magee <russell@keith-magee.com> | 2007-09-14 01:01:02 +0000 |
commit | 87e77ffca0a7df59ff9407ef30a2baa90f1d872d (patch) | |
tree | 94a098a50cb4a2b1cb68da3e94f6564e2b9caf4e | |
parent | cb9db449380d80f1e5856e64fd7cde15da63a315 (diff) | |
download | django-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.py | 11 | ||||
-rw-r--r-- | django/views/generic/list_detail.py | 3 | ||||
-rw-r--r-- | docs/generic_views.txt | 9 | ||||
-rw-r--r-- | tests/modeltests/pagination/models.py | 4 |
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] """} |