Browse Source

Fixed #14218 -- Added Paginator.__iter__().

Tanner Stirrat 5 years ago
parent
commit
17595407ca
4 changed files with 25 additions and 2 deletions
  1. 4 0
      django/core/paginator.py
  2. 9 2
      docs/ref/paginator.txt
  3. 5 0
      docs/releases/3.1.txt
  4. 7 0
      tests/pagination/tests.py

+ 4 - 0
django/core/paginator.py

@@ -34,6 +34,10 @@ class Paginator:
         self.orphans = int(orphans)
         self.allow_empty_first_page = allow_empty_first_page
 
+    def __iter__(self):
+        for page_number in self.page_range:
+            yield self.page(page_number)
+
     def validate_number(self, number):
         """Validate the given 1-based page number."""
         try:

+ 9 - 2
docs/ref/paginator.txt

@@ -14,6 +14,13 @@ classes live in :source:`django/core/paginator.py`.
 
 .. class:: Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)
 
+    A paginator acts like a sequence of :class:`Page` when using ``len()`` or
+    iterating it directly.
+
+    .. versionchanged:: 3.1
+
+        Support for iterating over ``Paginator`` was added.
+
 .. attribute:: Paginator.object_list
 
     Required. A list, tuple, ``QuerySet``, or other sliceable object with a
@@ -98,8 +105,8 @@ Attributes
 ``Page`` class
 ==============
 
-You usually won't construct ``Page`` objects by hand -- you'll get them using
-:meth:`Paginator.page`.
+You usually won't construct ``Page`` objects by hand -- you'll get them by
+iterating :class:`Paginator`, or by using :meth:`Paginator.page`.
 
 .. class:: Page(object_list, number, paginator)
 

+ 5 - 0
docs/releases/3.1.txt

@@ -162,6 +162,11 @@ Models
 
 * ...
 
+Pagination
+~~~~~~~~~~
+
+* Support for iterating over ``Paginator`` was added.
+
 Requests and Responses
 ~~~~~~~~~~~~~~~~~~~~~~
 

+ 7 - 0
tests/pagination/tests.py

@@ -297,6 +297,13 @@ class PaginationTests(SimpleTestCase):
         with self.assertRaises(EmptyPage):
             paginator.get_page(1)
 
+    def test_paginator_iteration(self):
+        paginator = Paginator([1, 2, 3], 2)
+        page_iterator = iter(paginator)
+        for page, expected in enumerate(([1, 2], [3]), start=1):
+            with self.subTest(page=page):
+                self.assertEqual(expected, list(next(page_iterator)))
+
 
 class ModelPaginationTests(TestCase):
     """