From 31f6421b134e4e83a459d2faa1009b33fefd6276 Mon Sep 17 00:00:00 2001 From: Andrew Jesaitis Date: Mon, 18 Mar 2013 14:29:37 -0600 Subject: [PATCH] Fixed #19938 -- Consumed iterator only once in paginator's Page Thanks Joshua Fialkoff for the report. --- django/core/paginator.py | 4 +++- tests/pagination/tests.py | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/django/core/paginator.py b/django/core/paginator.py index 9ccff51a34d..c8b9377856b 100644 --- a/django/core/paginator.py +++ b/django/core/paginator.py @@ -121,7 +121,9 @@ class Page(collections.Sequence): raise TypeError # The object_list is converted to a list so that if it was a QuerySet # it won't be a database hit per __getitem__. - return list(self.object_list)[index] + if not isinstance(self.object_list, list): + self.object_list = list(self.object_list) + return self.object_list[index] def has_next(self): return self.number < self.paginator.num_pages diff --git a/tests/pagination/tests.py b/tests/pagination/tests.py index dea57566726..1dea4526e3f 100644 --- a/tests/pagination/tests.py +++ b/tests/pagination/tests.py @@ -297,6 +297,7 @@ class ModelPaginationTests(TestCase): self.assertIsNone(p.object_list._result_cache) self.assertRaises(TypeError, lambda: p['has_previous']) self.assertIsNone(p.object_list._result_cache) + self.assertNotIsInstance(p.object_list, list) # Make sure slicing the Page object with numbers and slice objects work. self.assertEqual(p[0], Article.objects.get(headline='Article 1')) @@ -305,3 +306,5 @@ class ModelPaginationTests(TestCase): "", ] ) + # After __getitem__ is called, object_list is a list + self.assertIsInstance(p.object_list, list)