paginator.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536
  1. from __future__ import unicode_literals
  2. from django.conf import settings
  3. from django.core.paginator import Paginator, Page
  4. class EnhancedPaginator(Paginator):
  5. def __init__(self, object_list, per_page, **kwargs):
  6. if not isinstance(per_page, int) or per_page < 1:
  7. per_page = getattr(settings, 'PAGINATE_COUNT', 50)
  8. super(EnhancedPaginator, self).__init__(object_list, per_page, **kwargs)
  9. def _get_page(self, *args, **kwargs):
  10. return EnhancedPage(*args, **kwargs)
  11. class EnhancedPage(Page):
  12. def smart_pages(self):
  13. # When dealing with five or fewer pages, simply return the whole list.
  14. if self.paginator.num_pages <= 5:
  15. return self.paginator.page_range
  16. # Show first page, last page, next/previous two pages, and current page
  17. n = self.number
  18. pages_wanted = [1, n - 2, n - 1, n, n + 1, n + 2, self.paginator.num_pages]
  19. page_list = sorted(set(self.paginator.page_range).intersection(pages_wanted))
  20. # Insert skip markers
  21. skip_pages = [x[1] for x in zip(page_list[:-1], page_list[1:]) if (x[1] - x[0] != 1)]
  22. for i in skip_pages:
  23. page_list.insert(page_list.index(i), False)
  24. return page_list