diff --git a/django/views/generic/list.py b/django/views/generic/list.py index d90842fedc..22135720ed 100644 --- a/django/views/generic/list.py +++ b/django/views/generic/list.py @@ -32,9 +32,9 @@ class MultipleObjectMixin(object): """ 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()) - page = self.kwargs.get('page', None) or self.request.GET.get('page', 1) + 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') or self.request.GET.get('page') or 1 try: page_number = int(page) except ValueError: diff --git a/docs/ref/class-based-views.txt b/docs/ref/class-based-views.txt index 150ffff2e1..4b51469ced 100644 --- a/docs/ref/class-based-views.txt +++ b/docs/ref/class-based-views.txt @@ -344,22 +344,22 @@ MultipleObjectMixin **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 in the context, with the same value as ``object_list``. * ``is_paginated``: A boolean representing whether the results are 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 - equal to ``paginate_by``. + been specified, or if the available objects do not span multiple + pages. * ``paginator``: An instance of :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 :class:`django.core.paginator.Page`. If the page is not paginated, - this context variable will be ``None`` + this context variable will be ``None``. MultipleObjectTemplateResponseMixin ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/tests/regressiontests/generic_views/list.py b/tests/regressiontests/generic_views/list.py index bde741ef26..6ed28170a7 100644 --- a/tests/regressiontests/generic_views/list.py +++ b/tests/regressiontests/generic_views/list.py @@ -90,7 +90,7 @@ class ListViewTests(TestCase): self._make_authors(7) res = self.client.get('/list/authors/paginated/custom_class/') 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 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 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): res = self.client.get('/list/authors/notempty/') self.assertEqual(res.status_code, 200) diff --git a/tests/regressiontests/generic_views/urls.py b/tests/regressiontests/generic_views/urls.py index db09d63692..037da42d9a 100644 --- a/tests/regressiontests/generic_views/urls.py +++ b/tests/regressiontests/generic_views/urls.py @@ -98,6 +98,8 @@ urlpatterns = patterns('', # ListView (r'^list/dict/$', views.DictList.as_view()), + (r'^list/dict/paginated/$', + views.DictList.as_view(paginate_by=1)), url(r'^list/authors/$', views.AuthorList.as_view(), name="authors_list"),