社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

[精华] 七步教你实现Django网站列表自动分页

Py站长 • 11 年前 • 63123 次点击  

网站,特别是论坛,就如本社区一样,肯定会遇到某个页面要显示列表(比如本社区的首页,要显示主题列表),那肯定就会涉及到列表的分页功能。

举个例子,比如一个列表有100个item,那我们网站的页面是不是将此100个item都显示出来吗?显示不是哦,这样做以后一来是页面不好看(页面太长啦),用户体验不好(用户根本不需要看这么多item);第二就是性能不好(一下子读取这么多item,网站肯定很吃力 啊)。

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

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

本社区使用它来进行各种列表的分页。

介绍:

django-pagination allows for easy Digg-style pagination without modifying your views.

django-pagination就像它的名字一样,它是一个Django分页器,它包含了一组翻页功能相关的utils,包括用于实现翻页的tag等。使用起来非常简单。是目前使用最多的分页APP。

如何使用:

总共有七步来实现:

  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社区更有力量哈!更有人气哈!

推广链接: http://django-china.cn/

END

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53
 
63123 次点击  
文章 [ 46 ]  |  最新文章 9 年前
CbdFocus-weibo
Reply   •   1 楼
CbdFocus-weibo    9 年前

@357888473 我也有这个疑问,请问你解决了吗?

mihello
Reply   •   2 楼
mihello    9 年前

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

enjoyhot
Reply   •   3 楼
enjoyhot    10 年前

不过这是一个懒人工具,而且当一个页面有多处需要采用分页的话,就行不通了,要么修改django-pagination的源码,改变它的url指向,不过我没研究,当工程涉及到迁移时,要知道要安装各种东西本来就是个缺点,还要再修改源码,那就得不偿失。因而转战django自带的分页插件——Paginator。 可以参考我的博客http://blog.csdn.net/gugugujiawei/article/details/42558411 ,最近也在学django

545976064
Reply   •   4 楼
545976064    10 年前

@Lebesgue 谢谢,看了你的提醒我才注意到是这个问题,弄了2个小时,感谢!!

jingzuo
Reply   •   5 楼
jingzuo    10 年前

果断支持啊!最近就在做这样一个事呢?

往事如翔飞机王-weibo
Reply   •   6 楼
往事如翔飞机王-weibo    10 年前

很有用,谢谢!!

Lebesgue
Reply   •   7 楼
Lebesgue    11 年前

@Django中国社区 是这里:/usr/lib/python2.6/site-packages/django_pagination-1.0.7-py2.6.egg/pagination/

357888473
Reply   •   8 楼
357888473    11 年前

楼主请问,我在论坛贴里做分页后,楼层我用的 forloop.counter 到下一页后 for循环从新开始,楼层编号又从1开始了,请问这个该怎么解决呢?

Py站长
Reply   •   9 楼
Py站长    11 年前

@Lebesgue

Lebesgue
Reply   •   10 楼
Lebesgue    11 年前

@Django中国社区 具体是在哪里?绝对的路径是哪?我就是不知道pagination在哪里?我用grep也查不到

Py站长
Reply   •   11 楼
Py站长    11 年前

@Lebesgue 一般放到 pagination/templates/pagination/pagination.html 里,模板看得到的

Lebesgue
Reply   •   12 楼
Lebesgue    11 年前

@Django中国社区 pagination.html 这个模板的绝对是在放到哪里的?

Lebesgue
Reply   •   13 楼
Lebesgue    11 年前

呵呵,我的问题我已经解决了。 按照这个http://blog.csdn.net/kunshan_shenbin/article/details/7687134。 我是忘记加一个东西,return render_to_response('temp.html', {dict}, context_instance = RequestContext(request)) ;

Lebesgue
Reply   •   14 楼
Lebesgue    11 年前

@Django中国社区 我的出错信息,是怎么回事? <br /> ...<br /> Django Version: 1.5.1

Exception Type: KeyError

Exception Value: 'request'

Exception Location: /usr/lib/python2.6/site-packages/django/template/context.py in getitem, line 57

Python Executable: /usr/bin/python

Python Version: 2.6.6 <br /> ...

Error during template rendering

In template **/templates/user/user_list.html, error at line 5

request

...<br /> 5 {% autopaginate user_list 10 %}<br /> ... <br />

Lebesgue
Reply   •   15 楼
Lebesgue    11 年前

看起来真不错,赞一个!

我的益达
Reply   •   16 楼
我的益达    11 年前

enter link description here

告诉你是差不多的意思吧

Roy
Reply   •   17 楼
Roy    11 年前

@WildCat TEMPLATE_CONTEXT_PROCESSORS = ( "django.contrib.auth.context_processors.auth", "django.core.context_processors.debug", "django.core.context_processors.i18n", "django.core.context_processors.media", 'django.core.context_processors.static', "django.core.context_processors.request" ) #注意static

我的益达
Reply   •   18 楼
我的益达    11 年前

很赞啊

yybcjq
Reply   •   19 楼
yybcjq    11 年前

很棒

Py站长
Reply   •   20 楼
Py站长    11 年前

@WildCat 能否提供更多的信息?