Kaydet (Commit) b91a2a49 authored tarafından Rigel Di Scala's avatar Rigel Di Scala Kaydeden (comit) Tim Graham

Fixed #23190 -- Made Paginator.page_range an iterator

üst fd869cce
...@@ -600,6 +600,7 @@ answer newbie questions, and generally made Django that much better: ...@@ -600,6 +600,7 @@ answer newbie questions, and generally made Django that much better:
Richard Davies <richard.davies@elastichosts.com> Richard Davies <richard.davies@elastichosts.com>
Richard House <Richard.House@i-logue.com> Richard House <Richard.House@i-logue.com>
Rick Wagner <rwagner@physics.ucsd.edu> Rick Wagner <rwagner@physics.ucsd.edu>
Rigel Di Scala <rigel.discala@propylon.com>
Robert Coup Robert Coup
Robert Myers <myer0052@gmail.com> Robert Myers <myer0052@gmail.com>
Roberto Aguilar <roberto@baremetal.io> Roberto Aguilar <roberto@baremetal.io>
......
...@@ -96,7 +96,7 @@ class Paginator(object): ...@@ -96,7 +96,7 @@ class Paginator(object):
Returns a 1-based range of pages for iterating through within Returns a 1-based range of pages for iterating through within
a template for loop. a template for loop.
""" """
return list(six.moves.range(1, self.num_pages + 1)) return six.moves.range(1, self.num_pages + 1)
page_range = property(_get_page_range) page_range = property(_get_page_range)
......
...@@ -770,6 +770,19 @@ To fix your ``simple_tag``\s, it is best to apply the following practices: ...@@ -770,6 +770,19 @@ To fix your ``simple_tag``\s, it is best to apply the following practices:
Tags that follow these rules will be correct and safe whether they are run on Tags that follow these rules will be correct and safe whether they are run on
Django 1.9+ or earlier. Django 1.9+ or earlier.
``Paginator.page_range``
~~~~~~~~~~~~~~~~~~~~~~~~
:attr:`Paginator.page_range <django.core.paginator.Paginator.page_range>` is
now an iterator instead of a list.
In versions of Django previous to 1.8, ``Paginator.page_range`` returned a
``list`` in Python 2 and a ``range`` in Python 3. Django 1.8 consistently
returned a list, but an iterator is more efficient.
Existing code that depends on ``list`` specific features, such as indexing,
can be ported by converting the iterator into a ``list`` using ``list()``.
Miscellaneous Miscellaneous
~~~~~~~~~~~~~ ~~~~~~~~~~~~~
......
...@@ -24,8 +24,10 @@ page:: ...@@ -24,8 +24,10 @@ page::
4 4
>>> p.num_pages >>> p.num_pages
2 2
>>> type(p.page_range) # `<type 'rangeiterator'>` in Python 2.
<class 'range_iterator'>
>>> p.page_range >>> p.page_range
[1, 2] range(1, 3)
>>> page1 = p.page(1) >>> page1 = p.page(1)
>>> page1 >>> page1
...@@ -191,8 +193,12 @@ Attributes ...@@ -191,8 +193,12 @@ Attributes
.. attribute:: Paginator.page_range .. attribute:: Paginator.page_range
A 1-based range of page numbers, e.g., ``[1, 2, 3, 4]``. A 1-based range iterator of page numbers, e.g. yielding ``[1, 2, 3, 4]``.
.. versionchanged:: 1.9
In older versions, ``page_range`` returned a list instead of an
iterator.
``InvalidPage`` exceptions ``InvalidPage`` exceptions
========================== ==========================
......
...@@ -233,6 +233,12 @@ class PaginationTests(unittest.TestCase): ...@@ -233,6 +233,12 @@ class PaginationTests(unittest.TestCase):
self.assertEqual(page2.previous_page_number(), 1) self.assertEqual(page2.previous_page_number(), 1)
self.assertIsNone(page2.next_page_number()) self.assertIsNone(page2.next_page_number())
def test_page_range_iterator(self):
"""
Paginator.page_range should be an iterator.
"""
self.assertIsInstance(Paginator([1, 2, 3], 2).page_range, type(six.moves.range(0)))
class ModelPaginationTests(TestCase): class ModelPaginationTests(TestCase):
""" """
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment