django-pagination---七步教你实现Django网站列表自动分页

from:http://django-china.cn/topic/53/


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

举个例子,比如一个列表有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/

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django是一个使用Python编写的Web开发框架,它提供了强大的工具和功能来简化网站开发过程。在Django实现列表翻页可以通过以下步骤来完成。 首先,我们需要在视图函数中获取要展示的数据列表。可以使用Django提供的模型对象和查询语法来获取数据。例如,我们可以使用以下代码来获取所有的文章列表: ```python from django.shortcuts import render from .models import Article def articles(request): articles = Article.objects.all() return render(request, 'articles.html', {'articles': articles}) ``` 接下来,我们需要在页面中展示数据列表。可以使用Django的模板语言来遍历数据并在页面中展示。例如,我们可以使用以下代码来展示所有的文章标题: ```html {% for article in articles %} <h2>{{ article.title }}</h2> {% endfor %} ``` 然后,我们需要在页面中添加翻页功能。可以使用Django提供的分页器来实现翻页功能。首先,我们需要在视图函数中导入分页器类和分页器对象。然后,我们可以将数据列表传递给分页器对象,并指定每页要展示的数据数量。最后,我们可以在页面中添加翻页链接,通过调用分页器对象的方法来生成翻页链接。 在视图函数中导入分页器类和分页器对象: ```python from django.core.paginator import Paginator def articles(request): articles = Article.objects.all() paginator = Paginator(articles, 10) # 每页展示10篇文章 page_number = request.GET.get('page') page_obj = paginator.get_page(page_number) return render(request, 'articles.html', {'articles': page_obj}) ``` 在页面中展示数据列表和翻页链接: ```html {% for article in articles %} <h2>{{ article.title }}</h2> {% endfor %} <div class="pagination"> {% if page_obj.has_previous %} <a href="?page={{ page_obj.previous_page_number }}">上一页</a> {% endif %} <span class="current-page">{{ page_obj.number }}</span> {% if page_obj.has_next %} <a href="?page={{ page_obj.next_page_number }}">下一页</a> {% endif %} </div> ``` 通过以上步骤,我们可以在Django实现列表翻页的功能。每次点击翻页链接时,Django会根据当前页码和每页展示的数据数量,自动计算出要展示的数据范围,并将对应的数据传递给模板,以确保只展示当前页的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值