Fixes #14873 -- A paginated ListView with a List instead of queryset produces an error.

Additional minor change in functionality: the page is now not considered paginated if the objects do not span multiple pages according to the paginator. This will only affect views with a custom paginator method which uses orphans.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@14864 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Chris Beaven 2010-12-09 02:34:14 +00:00
parent b37d867929
commit ff8711a825
4 changed files with 16 additions and 9 deletions

View File

@ -32,9 +32,9 @@ class MultipleObjectMixin(object):
""" """
Paginate the queryset, if needed. Paginate the queryset, if needed.
""" """
if queryset.count() > page_size: paginator = self.get_paginator(queryset, page_size, allow_empty_first_page=self.get_allow_empty())
paginator = self.get_paginator(queryset, page_size, allow_empty_first_page=self.get_allow_empty()) if paginator.num_pages > 1:
page = self.kwargs.get('page', None) or self.request.GET.get('page', 1) page = self.kwargs.get('page') or self.request.GET.get('page') or 1
try: try:
page_number = int(page) page_number = int(page)
except ValueError: except ValueError:

View File

@ -344,22 +344,22 @@ MultipleObjectMixin
**Context** **Context**
* ``object_list``: The list of object that this view is displaying. If * ``object_list``: The list of objects that this view is displaying. If
``context_object_name`` is specified, that variable will also be set ``context_object_name`` is specified, that variable will also be set
in the context, with the same value as ``object_list``. in the context, with the same value as ``object_list``.
* ``is_paginated``: A boolean representing whether the results are * ``is_paginated``: A boolean representing whether the results are
paginated. Specifically, this is set to ``False`` if no page size has paginated. Specifically, this is set to ``False`` if no page size has
been specified, or if the number of available objects is less than or been specified, or if the available objects do not span multiple
equal to ``paginate_by``. pages.
* ``paginator``: An instance of * ``paginator``: An instance of
:class:`django.core.paginator.Paginator`. If the page is not :class:`django.core.paginator.Paginator`. If the page is not
paginated, this context variable will be ``None`` paginated, this context variable will be ``None``.
* ``page_obj``: An instance of * ``page_obj``: An instance of
:class:`django.core.paginator.Page`. If the page is not paginated, :class:`django.core.paginator.Page`. If the page is not paginated,
this context variable will be ``None`` this context variable will be ``None``.
MultipleObjectTemplateResponseMixin MultipleObjectTemplateResponseMixin
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -90,7 +90,7 @@ class ListViewTests(TestCase):
self._make_authors(7) self._make_authors(7)
res = self.client.get('/list/authors/paginated/custom_class/') res = self.client.get('/list/authors/paginated/custom_class/')
self.assertEqual(res.status_code, 200) self.assertEqual(res.status_code, 200)
self.assertIsInstance(res.context['paginator'], CustomPaginator) self.assertIsNone(res.context['paginator'])
# Custom pagination allows for 2 orphans on a page size of 5 # Custom pagination allows for 2 orphans on a page size of 5
self.assertEqual(len(res.context['object_list']), 7) self.assertEqual(len(res.context['object_list']), 7)
@ -101,6 +101,11 @@ class ListViewTests(TestCase):
# Custom pagination allows for 2 orphans on a page size of 5 # Custom pagination allows for 2 orphans on a page size of 5
self.assertEqual(len(res.context['object_list']), 7) self.assertEqual(len(res.context['object_list']), 7)
def test_paginated_non_queryset(self):
res = self.client.get('/list/dict/paginated/')
self.assertEqual(res.status_code, 200)
self.assertEqual(len(res.context['object_list']), 1)
def test_allow_empty_false(self): def test_allow_empty_false(self):
res = self.client.get('/list/authors/notempty/') res = self.client.get('/list/authors/notempty/')
self.assertEqual(res.status_code, 200) self.assertEqual(res.status_code, 200)

View File

@ -98,6 +98,8 @@ urlpatterns = patterns('',
# ListView # ListView
(r'^list/dict/$', (r'^list/dict/$',
views.DictList.as_view()), views.DictList.as_view()),
(r'^list/dict/paginated/$',
views.DictList.as_view(paginate_by=1)),
url(r'^list/authors/$', url(r'^list/authors/$',
views.AuthorList.as_view(), views.AuthorList.as_view(),
name="authors_list"), name="authors_list"),