#25513: Paginator support for large page counts ------------------------------+----------------------- Reporter: Tuttle | Owner: nobody Type: New feature | Status: new Component: Core (Other) | Version: 1.9a1 Severity: Normal | Keywords: paginator Triage Stage: Unreviewed | Has patch: 0 Easy pickings: 0 | UI/UX: 0 ------------------------------+----------------------- For large page counts I miss a standard way to display only interesting blocks of page links in the paginator. I guess Django should include one.
What do you think about integrating my implementation to {{{django.core.paginator.Page}}} drafted below? **Template example at the bottom.** {{{#!python from django.core.paginator import Paginator, Page class EllipsisPaginator(Paginator): def __init__(self, *args, **kwargs): # number of page links to always display after the first page self.start_wing = kwargs.pop('start_wing', 1) # number of page links to always display around the current page self.island_wings = kwargs.pop('island_wings', 2) # number of page links to always display before the last page self.end_wing = kwargs.pop('end_wing', 1) super(EllipsisPaginator, self).__init__(*args, **kwargs) def _get_page(self, *args, **kwargs): return EllipsisPage(*args, **kwargs) class EllipsisPage(Page): def pages_with_ellipsis(self): """ Generates the list of page numbers for large page counts. Yields '...' where the range of links should be omitted. >>> pp = EllipsisPaginator(object_list=range(38), per_page=3) >>> list(pp.page(1).pages_with_ellipsis()) [1, 2, 3, '...', 12, 13] >>> list(pp.page(2).pages_with_ellipsis()) [1, 2, 3, 4, '...', 12, 13] >>> list(pp.page(3).pages_with_ellipsis()) [1, 2, 3, 4, 5, '...', 12, 13] >>> list(pp.page(4).pages_with_ellipsis()) [1, 2, 3, 4, 5, 6, '...', 12, 13] >>> list(pp.page(5).pages_with_ellipsis()) [1, 2, 3, 4, 5, 6, 7, '...', 12, 13] >>> list(pp.page(6).pages_with_ellipsis()) [1, 2, 3, 4, 5, 6, 7, 8, '...', 12, 13] >>> list(pp.page(7).pages_with_ellipsis()) [1, 2, '...', 5, 6, 7, 8, 9, '...', 12, 13] >>> list(pp.page(8).pages_with_ellipsis()) [1, 2, '...', 6, 7, 8, 9, 10, 11, 12, 13] >>> list(pp.page(9).pages_with_ellipsis()) [1, 2, '...', 7, 8, 9, 10, 11, 12, 13] >>> list(pp.page(10).pages_with_ellipsis()) [1, 2, '...', 8, 9, 10, 11, 12, 13] >>> list(pp.page(11).pages_with_ellipsis()) [1, 2, '...', 9, 10, 11, 12, 13] >>> list(pp.page(12).pages_with_ellipsis()) [1, 2, '...', 10, 11, 12, 13] >>> list(pp.page(13).pages_with_ellipsis()) [1, 2, '...', 11, 12, 13] """ num = 1 end_of_start_wing = min(self.paginator.num_pages, self.paginator.start_wing+1) for num in xrange(1, end_of_start_wing+1): yield num island_start = self.number - self.paginator.island_wings if num < island_start-2: yield '...' num = island_start else: num += 1 island_end = min(self.paginator.num_pages, self.number + self.paginator.island_wings) for num in xrange(num, island_end+1): yield num start_of_end_wing = self.paginator.num_pages - self.paginator.end_wing if num < start_of_end_wing-2: yield '...' num = start_of_end_wing else: num += 1 for num in xrange(num, self.paginator.num_pages+1): yield num }}} Usage in the template: {{{ <ul class="pagination"> <li rel="prev"> <a {% if page.has_previous %}href="?page={{ page.previous_page_number }}"{% endif %}> Previous </a> </li> {% for pg in page.pages_with_ellipsis %} {% if pg != '...' %} <li {% if pg == page.number %}class="active"{% endif %}> <a {% if pg != page.number %}href="?page={{ pg }}"{% endif %}> {{ pg }} </a> </li> {% else %} <li><span>…</span></li> {% endif %} {% endfor %} <li rel="next" {% if page.has_next %}class="highlight"{% endif %}> <a {% if page.has_next %}href="?page={{ page.next_page_number }}"{% endif %}> Next </a> </li> </ul> }}} -- Ticket URL: <https://code.djangoproject.com/ticket/25513> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/049.5105bbdc5737d0667fe405f18ca55804%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.