其优势就是无需 count 以下总记录数
直接采用推进形式在百万记录及高负载有一定作用
但是只能上下推进 没更多页选择
paginator.py
[code]class InvalidPage(Exception):
pass
class PageNotAnInteger(InvalidPage):
pass
class EmptyPage(InvalidPage):
pass
class Paginator(object):
def __init__(self,object_list,per_page):
self.object_list = object_list
self.per_page = per_page
def page(self,number=1):
self.cur_pages = number
if self.cur_pages < 1 :
number = 1
number = (int(number)-1)*int(self.per_page)
max = int(number)+int(self.per_page)+1
data = self.object_list[number:max]
num = data.__len__()
data = data._result_cache
# if next
if num > int(self.per_page):
data = data[0:-1]
nextpage = abs((int(number)+int(self.per_page))/int(self.per_page))+1
else:
nextpage = None
# if prev
if int(number) > 0:
if int(number) < int(self.per_page):
prevpage = 0
else:
prevpage = abs(int(int(number)-int(self.per_page))/int(self.per_page))+1
else:
prevpage = None
return Page(data,nextpage,prevpage,self)
def _get_num_pages(self):
return self.cur_pages
num_pages = property(_get_num_pages)
def _get_num_per_page(self):
return self.per_page
per_pages = property(_get_num_per_page)
class Page(object):
def __init__(self,object_list,next_page,prev_page,paginator):
self.object_list = object_list
self.next_number = next_page
self.previous_number = prev_page
self.paginator = paginator
def has_next(self):
if self.next_number is None:
return False
else:
return True
def has_previous(self):
if self.previous_number is None:
return False
else:
return True
def next_page_number(self):
return self.next_number
def previous_page_number(self):
return self.previous_number
[/code]