summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authororf <tom@tomforb.es>2017-06-08 17:29:13 +0100
committerTim Graham <timograham@gmail.com>2017-06-13 08:13:17 -0400
commita118287bca65f2e5da110c89509941c677ebc2e1 (patch)
treeaf878dee91ba1dcf9a674185e05291c7618a0bd9
parent82175ead723f8fa3f9271fbd4b24275097029aab (diff)
Fixed #28284 -- Prevented Paginator's unordered object list warning from evaluating a QuerySet.
-rw-r--r--django/core/paginator.py10
-rw-r--r--docs/releases/1.11.3.txt3
-rw-r--r--tests/pagination/tests.py22
3 files changed, 29 insertions, 6 deletions
diff --git a/django/core/paginator.py b/django/core/paginator.py
index 2933f802c6..2686957af0 100644
--- a/django/core/paginator.py
+++ b/django/core/paginator.py
@@ -96,10 +96,16 @@ class Paginator:
"""
Warn if self.object_list is unordered (typically a QuerySet).
"""
- if hasattr(self.object_list, 'ordered') and not self.object_list.ordered:
+ ordered = getattr(self.object_list, 'ordered', None)
+ if ordered is not None and not ordered:
+ obj_list_repr = (
+ '{} {}'.format(self.object_list.model, self.object_list.__class__.__name__)
+ if hasattr(self.object_list, 'model')
+ else '{!r}'.format(self.object_list)
+ )
warnings.warn(
'Pagination may yield inconsistent results with an unordered '
- 'object_list: {!r}'.format(self.object_list),
+ 'object_list: {}.'.format(obj_list_repr),
UnorderedObjectListWarning,
stacklevel=3
)
diff --git a/docs/releases/1.11.3.txt b/docs/releases/1.11.3.txt
index 33645d05b3..6afe77e8bb 100644
--- a/docs/releases/1.11.3.txt
+++ b/docs/releases/1.11.3.txt
@@ -32,3 +32,6 @@ Bugfixes
* Fixed ``QuerySet.union()``, ``intersection()``, and ``difference()`` when
combining with an ``EmptyQuerySet`` (:ticket:`28293`).
+
+* Prevented ``Paginator``’s unordered object list warning from evaluating a
+ ``QuerySet`` (:ticket:`28284`).
diff --git a/tests/pagination/tests.py b/tests/pagination/tests.py
index 30fa310dc0..9319666597 100644
--- a/tests/pagination/tests.py
+++ b/tests/pagination/tests.py
@@ -328,11 +328,25 @@ class ModelPaginationTests(TestCase):
warning = warns[0]
self.assertEqual(str(warning.message), (
"Pagination may yield inconsistent results with an unordered "
- "object_list: <QuerySet [<Article: Article 1>, "
- "<Article: Article 2>, <Article: Article 3>, <Article: Article 4>, "
- "<Article: Article 5>, <Article: Article 6>, <Article: Article 7>, "
- "<Article: Article 8>, <Article: Article 9>]>"
+ "object_list: <class 'pagination.models.Article'> QuerySet."
))
# The warning points at the Paginator caller (i.e. the stacklevel
# is appropriate).
self.assertEqual(warning.filename, __file__)
+
+ def test_paginating_unordered_object_list_raises_warning(self):
+ """
+ Unordered object list warning with an object that has an orderd
+ attribute but not a model attribute.
+ """
+ class ObjectList():
+ ordered = False
+ object_list = ObjectList()
+ with warnings.catch_warnings(record=True) as warns:
+ warnings.filterwarnings('always', category=UnorderedObjectListWarning)
+ Paginator(object_list, 5)
+ self.assertEqual(len(warns), 1)
+ self.assertEqual(str(warns[0].message), (
+ "Pagination may yield inconsistent results with an unordered "
+ "object_list: {!r}.".format(object_list)
+ ))