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:
parent
b37d867929
commit
ff8711a825
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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"),
|
||||||
|
|
Loading…
Reference in New Issue