django分页 所有问题处理结果...汗!搞了那么多天啊

来源:互联网 发布:毛笔字软件中文版 编辑:程序博客网 时间:2024/05/17 22:18

django分页 所有问题处理结果...汗!搞了那么多天啊

编辑 | 删除 | 权限设置 | 更多
waiting未    发表于2010年07月26日 01:13 阅读(1) 评论(0)分类: 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这是不需要转码的 ,至于其他的方法我笔记里有

原创粉丝点击