Skip to content

Instantly share code, notes, and snippets.

@umrashrf
Created June 15, 2013 15:43
Show Gist options
  • Save umrashrf/5788521 to your computer and use it in GitHub Desktop.
Save umrashrf/5788521 to your computer and use it in GitHub Desktop.
Django Paginator override for smart page_range or digg-style pagination.
from django.core.paginator import Paginator, Page
class SmartPaginator(Paginator):
def __init__(self, object_list, per_page, range_count=3,
orphans=0, allow_empty_first_page=True):
self.range_count = range_count
super(SmartPaginator, self).__init__(object_list, per_page, orphans=orphans,
allow_empty_first_page=allow_empty_first_page)
def page(self, number):
self.current_page = self.validate_number(number)
return super(SmartPaginator, self).page(number)
def _get_page_range(self):
"""
Returns a smart range of pages for iterating through within
a template for loop.
"""
start = self.current_page - self.range_count
start_offset = 0
if start < 1:
start_offset = start
start = 1
end = self.current_page + self.range_count
end_offset = 0
if end > self.num_pages:
end_offset = end - self.num_pages
end = self.num_pages
if start_offset < 0:
end -= start_offset - 1
if end_offset > 0:
start -= end_offset
end += 1
return range(start, end)
page_range = property(_get_page_range)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment