Fixed #4919 -- Added 'last' marker on paginators. Thanks to patrick@vonautomatisch.atfor the idea, and nick@efford.org for the patch and docs.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@6149 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Russell Keith-Magee 2007-09-14 01:52:10 +00:00
parent 62fe5cf138
commit d14c756b5e
2 changed files with 31 additions and 16 deletions

View File

@ -49,10 +49,17 @@ def object_list(request, queryset, paginate_by=None, page=None,
if not page: if not page:
page = request.GET.get('page', 1) page = request.GET.get('page', 1)
try: try:
page = int(page) page_number = int(page)
object_list = paginator.get_page(page - 1) except ValueError:
except (InvalidPage, ValueError): if page == 'last':
if page == 1 and allow_empty: page_number = paginator.pages
else:
# Page is not 'last', nor can it be converted to an int
raise Http404
try:
object_list = paginator.get_page(page_number - 1)
except InvalidPage:
if page_number == 1 and allow_empty:
object_list = [] object_list = []
else: else:
raise Http404 raise Http404
@ -60,13 +67,13 @@ def object_list(request, queryset, paginate_by=None, page=None,
'%s_list' % template_object_name: object_list, '%s_list' % template_object_name: object_list,
'is_paginated': paginator.pages > 1, 'is_paginated': paginator.pages > 1,
'results_per_page': paginate_by, 'results_per_page': paginate_by,
'has_next': paginator.has_next_page(page - 1), 'has_next': paginator.has_next_page(page_number - 1),
'has_previous': paginator.has_previous_page(page - 1), 'has_previous': paginator.has_previous_page(page_number - 1),
'page': page, 'page': page_number,
'next': page + 1, 'next': page_number + 1,
'previous': page - 1, 'previous': page_number - 1,
'last_on_page': paginator.last_on_page(page - 1), 'last_on_page': paginator.last_on_page(page_number - 1),
'first_on_page': paginator.first_on_page(page - 1), 'first_on_page': paginator.first_on_page(page_number - 1),
'pages': paginator.pages, 'pages': paginator.pages,
'hits' : paginator.hits, 'hits' : paginator.hits,
'page_range' : paginator.page_range 'page_range' : paginator.page_range

View File

@ -688,9 +688,8 @@ A page representing a list of objects.
* ``paginate_by``: An integer specifying how many objects should be * ``paginate_by``: An integer specifying how many objects should be
displayed per page. If this is given, the view will paginate objects with displayed per page. If this is given, the view will paginate objects with
``paginate_by`` objects per page. The view will expect either a ``page`` ``paginate_by`` objects per page. The view will expect either a ``page``
query string parameter (via ``GET``) containing a 1-based page query string parameter (via ``GET``) or a ``page`` variable specified in
number, or a ``page`` variable specified in the URLconf. See the URLconf. See "Notes on pagination" below.
"Notes on pagination" below.
* ``template_name``: The full name of a template to use in rendering the * ``template_name``: The full name of a template to use in rendering the
page. This lets you override the default template name (see below). page. This lets you override the default template name (see below).
@ -780,7 +779,7 @@ specify the page number in the URL in one of two ways:
(r'^objects/page(?P<page>[0-9]+)/$', 'object_list', dict(info_dict)) (r'^objects/page(?P<page>[0-9]+)/$', 'object_list', dict(info_dict))
* Pass the page number via the ``page`` query-string parameter. For * Pass the page number via the ``page`` query-string parameter. For
example, a URL would look like this: example, a URL would look like this::
/objects/?page=3 /objects/?page=3
@ -789,7 +788,16 @@ specify the page number in the URL in one of two ways:
to create a link to every page of results. 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 These values and lists are is 1-based, not 0-based, so the first page would be
represented as page ``1``. represented as page ``1``. As a special case, you are also permitted to use
``last`` as a value for ``page``::
/objects/?page=last
This allows you to access the final page of results without first having to
determine how many pages there are.
Note that ``page`` *must* be either a valid page number or the value ``last``;
any other value for ``page`` will result in a 404 error.
``django.views.generic.list_detail.object_detail`` ``django.views.generic.list_detail.object_detail``
-------------------------------------------------- --------------------------------------------------