Apr 12, 2008

Using the new Django Paginator with page links

I have made a Customized Page class for the new Django Paginator.
It shows page links with "prev", "next" buttons.


utils.py

import string
from django.core.paginator import Page, InvalidPage

class BetterPage(Page):
def __init__(self, page, link_template):
self.link_template = link_template
Page.__init__(self, page.object_list, page.number, page.paginator)

def previous_link(self):
if self.has_previous():
tpl = string.Template(self.link_template)
return tpl.safe_substitute({"page": self.number - 1})
else:
return None

def next_link(self):
if self.has_next():
tpl = string.Template(self.link_template)
return tpl.safe_substitute({"page": self.number + 1})
else:
return None

def make_page_links(self, start, end):
tpl = string.Template(self.link_template)
return [(p+1, tpl.safe_substitute({"page": p + 1}), (p+1 == self.number)) for p in range(start, end)]

def page_links(self):
return self.make_page_links(0, self.paginator.num_pages)

def windowed_page_links(self, window_size=5):
links = []
if self.paginator.num_pages <= window_size: links = [self.page_links()] elif self.number - window_size/2 <= 3: links = [self.make_page_links(0, window_size), self.make_page_links(self.paginator.num_pages-2, self.paginator.num_pages)] elif self.number + window_size/2 > self.paginator.num_pages - 2:
links = [self.make_page_links(0, 2), self.make_page_links(self.paginator.num_pages-window_size, self.paginator.num_pages)]
else:
links = [self.make_page_links(0, 2),
self.make_page_links(self.number-window_size/2-1, self.number+window_size/2-1),
self.make_page_links(self.paginator.num_pages-2, self.paginator.num_pages)]
return links

No comments: