django分页 所有问题处理结果...汗!搞了那么多天啊
#-*-coding:utf-8-*- """ Google App Engine (GAE) 分页类 Usage: query = User.gql('order by lastname') pager = Paginator(query,url="/userlist/",pagesize=5) results,pager = pager.fetch(offset)
""" class Paginato(object): def __init__(self,query=None,pagesize=20,url=None): self.query = query self.pagesize = pagesize self.url = url
def fetch(self,offset): results =self.query[offset:] ##results =self.query.fetch(300,offset) 本来这里是后便的代码,fetch在gae里的意思是取300个实例出来,但是要跳过0ffset个 换到django就是把所有的取出来 然后去offset之后的所有代码
output = self.create_links(offset,len(results)) return (results[:self.pagesize],output)
def create_links(self,offset,count):
num_links = 4 ##这个是空值页面最多显示的分页数 if count % self.pagesize ==0 : num_pages = count/self.pagesize -1 else: num_pages = count/self.pagesize
cur_page = offset/self.pagesize + 1 start_page = 1 end_page = cur_page + num_links
if cur_page - num_links >0: start_page = cur_page - num_links + 1 if num_pages < num_links: end_page = cur_page + num_pages
if end_page==1: return '' links = []
for i in range(start_page,end_page+1): links_item = {} links_item['index'] = i links_item['offset'] = (i-1) * self.pagesize links.append(links_item)
pagelinks = {} pagelinks['item'] = links pagelinks['cur_page'] = cur_page if cur_page>1: pagelinks['prev'] = offset - self.pagesize else: pagelinks['prev'] = None
if cur_page < end_page: pagelinks['next'] = offset + self.pagesize else: pagelinks['next'] = None
output = ''; if pagelinks['prev'] is not None: output += r'<a href="%s/offset/%s">上一页</a> ' % (self.url,pagelinks['prev'])
for i in pagelinks['item']: if i['index'] != pagelinks['cur_page']: output += r'<a href="%s/offset/%s">%s</a> ' % (self.url,i['offset'],i['index']) else: output += r' <a href="" style="color:#009193">%s</a> ' % (i['index'])
if pagelinks['next'] is not None: output += r'<a href="%s/offset/%s">下一页</a> ' % (self.url,pagelinks['next'])
return output
### output = ''; if pagelinks['prev'] is not None: output += '<a href="%s?offset=%s">上一页</a> ' % (self.url,pagelinks['prev']) for i in pagelinks['item']: if i['index'] != pagelinks['cur_page']: output += '<a href="%s?offset=%s">%s</a> ' % (self.url,i['offset'],i['index']) else: output += ' <a href="" style="color:#009193">%s</a> ' % (i['index']) if pagelinks['next'] is not None: output += '<a href="%s?offset=%s">下一页</a> ' % (self.url,pagelinks['next']) return output
这里的<a href="%s/offset/%s">,因为在前台点击的时候总是把=转码了,变成d35,所以我用斜杠把他们出别开,然后再url.py我是这么设置
匹配的,(r'^sub/(/d{1,10})/offset/(/d{1,10})$', views.hours_ahead),每一个括号其实就是views里的一个参数,所以我views是这么设
置的,因为(r'^sub/(/d{1,10})/$', views.hours_ahead),公用一个views视图,所以我视图中有个缺省参数,
def hours_ahead(request, subcateid,d=''): id = int(subcateid) infolist=Info.objects.filter(subcategory__id__exact=id).order_by('-date') u ="/sub/"+subcateid
pager = Paginato(infolist,5,url=u) ##这里5是分5个
page = d ##这里本来我page=request.GET.get('offset'),这里是针对以前没改的pager.py里的url的,但是后来改了url所以参数直接传
到views里了
infos = {}
if page is '': page = '0'
infos,pager = pager.fetch(int(page)) subcategorys = Subcategory.objects.filter(id=id) t = get_template('infoList.html')
html = t.render(Context({'infoList': infos,'subcategory':subcategorys,'pager':pager,'page':page})) return HttpResponse(html)
还有个问题 就是前台出现转码的问题 我最后用{{pager|safe}},告诉django这是不需要转码的 ,至于其他的方法我笔记里有 |