首页 > Python > Python分页类和Django分页的实现办法
2016
10-12

Python分页类和Django分页的实现办法

一:python分页类:

class Pager:
    def __init__(self,url,total_count,page_size=20,cur_page=1):
        self.url=url#转向地址
        self.total_count=total_count#总条目数
        self.page_size=page_size#每页条目数
        self.cur_page=cur_page#当前页数
        self.page_count,tail=divmod(self.total_count,self.page_size)#获取总分页数
        if tail is not 0:self.page_count+=1
        self.pages=[]#结果集
    def getPage(self):
        if self.cur_page>1:
            self.pages.append('<a href="%s">上一页</a>' %(self.url %(self.cur_page-1)))
            self.pages.append('<a href="%s">首页</a>' %(self.url %1))
        if self.cur_page<=5:limit_s=1
        else:limit_s=self.cur_page-4
        if self.page_count>=self.cur_page+5:limit_e=self.cur_page+5
        else:
            limit_e=self.page_count
            if self.cur_page>=10:limit_s=self.cur_page-9
        for i in xrange(limit_s,limit_e+1):
            if self.cur_page==i:
                self.pages.append('<span>%s</span>'%self.cur_page)
            else:
                self.pages.append('<a href="%s">%s</a>' %(self.url%i,i))
        if self.cur_page<self.page_count:
            self.pages.append('<a href="%s">下一页</a>' %(self.url%(self.cur_page+1)))
            self.pages.append('<a href="%s">尾页</a>'%(self.url %self.page_count))
        return "".join(self.pages)
 
html='''
<html>
    <head>
    <title>测试</title>
    <style type="text/css">
    #pager a,#pager span{
        border:1px solid #E7ECF0;
        height:22px;
        line-height: 22px;
        padding:0px 8px;
        margin-right: 5px;
        text-decoration: none;
        text-align:center;
        width:auto;
    }
    </style>
    </head>
    <body>
        <div id="pager">
         %s
        </div>
    </body>
</html>
 
'''
pages=Pager(url='/p?=%s',total_count=10000000,page_size=20,cur_page=20).getPage()
f=open("test.html","wb")
f.write(html %pages)
f.flush()
f.close()

二.Django分页的实现办法

废话就不说啦,今天将要介绍一下Django的分页利器APP--- django-pagination,它可以非常方便的为你实现你的分页目标!

项目主页: https://github.com/ericflo/django-pagination/

如何使用:

总共有七步来实现:

  1. 安装

    sudo Python setup.py install

  2. 将该APP安装至Django项目中。(请修改settings.py)

     INSTALLED_APPS = (
           # ...
           'pagination',
       )
  3. 在Django项目的middleware中安装此APP:(请修改settings.py)

     MIDDLEWARE_CLASSES = (
           # ...
           'pagination.middleware.PaginationMiddleware',
       )

    这样,django-pagination可以在页面请求过程中做一些简单的处理。

  4. 请确保你的请求上下文含有django.core.context_processors.request。 如果没有的话,请将django.core.context_processors.request加入到 TEMPLATE_CONTEXT_PROCESSORS中,示例如下:(请修改settings.py)。

    ("django.core.context_processors.auth",
        "django.core.context_processors.debug",
        "django.core.context_processors.i18n",
        "django.core.context_processors.media",
        "django.core.context_processors.request")
  5. 在你要进行列表分页的页面(template)的页面上方(最好是最上面)中 导入 它的tag, 以便后续我们可以在模板中使用它的一些功能。

     {% load pagination_tags %}
  6. 在你的模板(template)页面上,对你想要分页的列表变量(object_list)进行分页,在模板中写如下代码:(这段短代码的位置要在 放在 你显示 object_list 之前)

    {% autopaginate object_list %}

    上面对列表分页后默认每页有20个,如果你想自己自定义,可以这样:

    {% autopaginate object_list 10 %}

    这样对列表分页后每页显示10个。

    分页后,django-pagination会更改object_list 的值,将object_list 变成一个只有20个(默认情况下)的列表。你可以对object_list 进行遍历,显示出他们。

    经过此步后,大家就可以获取得到只有一页的列表啦。

  7. 经过上步,我们得到一页列表啦,但是我们想要第二页,第三页……,最好是在每一页的最底部有一个页数导航栏可以供大家选择。例如:

    方法很简单。只要在页面的最底下使用如下代码:

    {% paginate %}

    当然,页数导航栏使用的UI模板是 pagination/templates/pagination/pagination.html ,我们需要按我们站点的UI美观需要来更改它哦。

小结:

怎么样,使用django-pagination后,大家肯定会觉得:“哇,太好用啦”,什么事都帮我们做啦。是不是非常方便呢? :)

关于性能:

还有一个问题没有解决哦,因为肯定有朋友会问,如果一个列表有100000个item, 我们想要实现每页40个,那么,当将我们请求该列表时, django-pagination在分页过程中,请求数据库是取40个,还是取100000啊!

显然,django-pagination是不可能取100000的啦。

django-pagination 巧妙的利用了Django延迟获取数据的特性,因此,django-pagination每次取数据都是只取每页的数据的(也就是上例中的40个),所以是不会有性能 影响 的哦。

关于这个问题,作者的主页有两个视频解释:(英文视频,E文可以的同学可以看看)

http://eflorenzano.com/blog/2008/07/12/first-two-django-screencasts/

三、django自带分页功能

新版的Django自带分页工具,不用安装插件 https://docs.djangoproject.com/en/1.8/topics/pagination/

作者:admin
admin
TTF的家园-www.ttfde.top 个人博客以便写写东西,欢迎喜欢互联网的朋友一起交流!

本文》有 0 条评论

留下一个回复