Commit ff8711a8 authored by Chris Beaven's avatar Chris Beaven
Browse files

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
parent b37d8679
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -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)
        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:
+5 −5
Original line number Diff line number Diff line
@@ -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
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+6 −1
Original line number Diff line number Diff line
@@ -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)
+2 −0
Original line number Diff line number Diff line
@@ -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"),