Skip to content

Instantly share code, notes, and snippets.

@pylemon
Created April 7, 2012 15:54
Show Gist options
  • Save pylemon/2329904 to your computer and use it in GitHub Desktop.
Save pylemon/2329904 to your computer and use it in GitHub Desktop.
django: better paginator
from django.core.paginator import Paginator, EmptyPage
class BetterPaginator(Paginator):
"""An enhanced version of the Paginator"""
def __init__(self, getvars, *args, **kwargs):
"""default args are:
self, object_list, per_page, orphans=0, allow_empty_first_page=True
"""
super(BetterPaginator, self).__init__(*args, **kwargs)
getvars_dict = getvars.copy()
try:
self.page_num = self.validate_number(getvars_dict.pop('page')[0])
except KeyError:
self.page_num = 1
self.getvars = getvars_dict and '&' + getvars_dict.urlencode() or ''
def get_context(self, range_gap=5):
if self.page_num > range_gap:
start = self.page_num - range_gap
else:
start = 1
if self.page_num < (self.num_pages - range_gap):
end = self.page_num + range_gap + 1
else:
end = self.num_pages + 1
try:
paginator = self.page(self.page_num)
except EmptyPage:
paginator = self.page(1)
return {
'page_range': range(start, end),
'objects': paginator.object_list,
'num_pages': self.num_pages,
'page_num': self.page_num,
'per_page':self.per_page,
'has_previous': paginator.has_previous(),
'has_next': paginator.has_next(),
'previous_page': paginator.previous_page_number(),
'next_page': paginator.next_page_number(),
'is_first': self.page_num == 1,
'is_last': self.page_num == self.num_pages,
'objects_count': self.count,
'start_index': paginator.start_index,
'end_index': paginator.end_index,
'getvars': self.getvars,
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment