paginator.py 1.0 KB

12345678910111213141516171819202122232425262728293031323334
  1. from math import ceil
  2. from django.core.paginator import Paginator
  3. from django.utils.functional import cached_property
  4. class PostsPaginator(Paginator):
  5. """
  6. Paginator that returns that makes last item on page
  7. repeat as first item on next page.
  8. """
  9. @cached_property
  10. def num_pages(self):
  11. """
  12. Returns the total number of pages.
  13. """
  14. if self.count == 0 and not self.allow_empty_first_page:
  15. return 0
  16. hits = max(1, self.count - self.orphans)
  17. hits += int(ceil(hits / float(self.per_page)))
  18. return int(ceil(hits / float(self.per_page)))
  19. def page(self, number):
  20. """
  21. Returns a Page object for the given 1-based page number.
  22. """
  23. number = self.validate_number(number)
  24. bottom = (number - 1) * self.per_page
  25. if number > 1:
  26. bottom -= number - 1
  27. top = bottom + self.per_page
  28. if top + self.orphans >= self.count:
  29. top = self.count
  30. return self._get_page(self.object_list[bottom:top], number, self)