1. 例1: 基础的分页
    1). vim app01/views.py
        def users(request):
            from django.core.paginator import Paginator
            curent_page = request.GET.get('p', 1)  # 想获取的页数, 没有指定就返回第一页
            user_list = District.objects.all()
            paginator = Paginator(user_list, 10)  # 每页 10 个数据
            """
            参数:
                object_list : 传入一个对象, 从数据库中取出的数据对象 ,也就是上面的 user_list
                per_page  : 每页的页数
                orphans=0 :
                allow_empty_first_page=True
            """
            # 对象.page(获取的页数)  # 获取指定页数的数据
            obj = paginator.page(curent_page) # 参数为 : 要获取的页数
            # obj 对象中的方法:
            #      {{ obj.has_next }}               是否有下一页
            #      {{ obj.next_page_number }}       下一页页码

#      {{ obj.has_previous }}           是否有上一页
            #      {{ obj.previous_page_number }}   上一页页码

#      {{ obj.object_list }}            分页之后的数据列表
            #      {{ obj.number }}                 当前页
            #      {{ obj.paginator }}   paginator 对象 就是 paginator = Paginator(list, nmber) 这个方法是为了调用其下的方法

return render(request, 'index.html', {'obj': obj})

2). vim templates/index.html
        {% for i in page_obj.object_list %}
            <tr>
                <td>{{ i.id }}</td>
                <td>{{ i.name }}</td>
                <td>{{ i.password }}</td>
                <td>{{ i.email }}</td>
            </tr>
        {% endfor %}

3). 例1 知识点
        (1): paginator = Paginator(user_list, 10)  对象的参数
        (2): obj = paginator.page(curent_page) 的方法  # 参数为 : 要获取的页数
            obj 对象中的方法:
                {{ obj.has_next }}               是否有下一页
                {{ obj.next_page_number }}       下一页页码

{{ obj.has_previous }}           是否有上一页
                {{ obj.previous_page_number }}   上一页页码

{{ obj.object_list }}            分页之后的数据列表
                {{ obj.number }}                 当前页
                {{ obj.paginator }}   paginator 对象 就是 paginator = Paginator(list, nmber) 这个方法是为了调用其下的方法
            注意: 这几个方法不是在 Python 在中使用的, 而是在模板语法中调用的, 如 例 4.3 例子

2. 处理异常
    问题描述
        UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list:
       
/laojia/reboot/opsweb/accounts/views.py:234:
UnorderedObjectListWarning: Pagination may yield inconsistent results
with an unordered object_list: <class
'django.contrib.auth.models.User'> QuerySet.

paginator = Paginator(user_list, self.paginate_by)

这个是因为django,查询出来多条记录时,默认是无序排列的,所以 每查询一次 分页的 list 都是不一样的。

解决方法:
        查询的时候,增加一个排序就可以了
        user_list = Profile.objects.get_queryset().order_by('id')
            或者
        user_list = models.District.objects.all().order_by('id')

但是这样写, 会占用资源

3. 例2:
    3.1. 例二解释
        (1): 处理 ?p 参数 不正确时 报错
        (2): 添加 上一页, 下一页

3.2. 修改视图函数
        def users(request):
            from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
            # 导入 两个 处理报错的 模块
            #   EmptyPage : 处理数字不正却时报错
            #   PageNotAnInteger : 处理不是数字报错

curent_page = request.GET.get('p', 1)  # 想获取的页数, 没有指定就返回第一页

user_list = models.District.objects.all().order_by('id')
            paginator = Paginator(user_list,10)

try:
                page_obj = paginator.page(curent_page)
            except EmptyPage as e:
                page_obj = paginator.page(1)
            except PageNotAnInteger as not_int_err:
                page_obj = paginator.page(1)

return render(request, 'index.html', {'page_obj': page_obj})

4.3. vim templates/index.html
        <center>
            <table border="1" cellspacing="0" width="500">
                <tr>
                    <th>ID</th>
                    <th>用户名</th>
                    <th>密码</th>
                    <th>邮箱</th>
                </tr>
                {% for i in page_obj.object_list %}
                <tr>
                    <td>{{ i.id }}</td>
                    <td>{{ i.name }}</td>
                    <td>{{ i.password }}</td>
                    <td>{{ i.email }}</td>
                </tr>
                {% endfor %}
            </table>
            <div>
                {% if page_obj.has_previous  %}
                    <a href="/users?p={{ page_obj.previous_page_number }}">上一页</a>
                {% else %}
                    <a href="">上一页</a>
                {% endif %}
                {% if page_obj.has_next  %}
                    <a href="/users?p={{ page_obj.next_page_number }}">下一页</a>
                {% else %}
                    <a href="">下一页</a>
                {% endif %}
            </div>
        </center>

3.4. 例3 知识点总结
        (1): 使用了 列2 中的知识点 paginator.page(curent_page) 中的方法
        (2): 添加了两个议程处理模块

4. 例3:
    4.1. 介绍
        1). 使用 {{ page_obj.paginator }} 的方法
        2). 在页面上添加的页数
        3). 添加页码
        4). 添加 当前页 与 尾页

4.2. 知识点
        1). {{ page_obj.paginator }} : page_obj 就是传到 html 的对象 实际上就是 Paginator() 对象
        2). {{ page_obj.paginator }} : 的方法
            per_page :  每页显示条目数量
            count :    数据总个数
            num_pages : 总页数
            page_range : 总页数的索引范围,如: 如果 总页数是 11, name 这个值就是 (1,12) 由于不取尾的缘故所以 11+1

使用时加 .count 即可, 如 : {{ page_obj.paginator.count }}

4.3. 视图函数不变

4.4. 修改 center 下的 div
        <div>
            {% if page_obj.has_previous  %}
                <a href="/users?p={{ page_obj.previous_page_number }}">上一页</a>
            {% else %}
                <a href="">上一页</a>
            {% endif %}
                {# 5.3. 新添加 内容, 显示页码 #}
                {% for i in page_obj.paginator.page_range %}
                    <a href="/users?p={{ i }}">{{ i }}</a>
                {% endfor %}

{% if page_obj.has_next  %}
                <a href="/users?p={{ page_obj.next_page_number }}">下一页</a>
            {% else %}
                <a href="">下一页</a>
            {% endif %}

{# 5.3. 添加 当前页 与 尾页 #}
            <span>{{ page_obj.number }}/</span> {# 当前页 #}
            <span>{{ page_obj.paginator.num_pages }}</span>  {# 总页数 #}
        </div>

4. 缺点
    django 无法解决页码过多的问题, 需要自己进行扩展

python django 之 django自带的分页的更多相关文章

  1. 比Django官方实现更好的分页组件+Bootstrap整合

    前言 Django全家桶自带的分页组件只能说能满足分页这个功能,但是没那么好用就是了 Django的分页效果 django-pure-pagination分页效果 使用方法 首先安装: pip ins ...

  2. Django - Cookie、Session、自定义分页和Django分页器

    2. 今日内容 https://www.cnblogs.com/liwenzhou/p/8343243.html 1. Cookie和Session 1. Cookie 服务端: 1. 生成字符串 2 ...

  3. python web框架 Django进阶

    django 进阶 基础中,一些操作都是手动创建连接的非主流操作,这样显得太low,当然也是为了熟悉这个框架! 实际中,django自带连接数据库和创建app的机制,同时还有更完善的路由系统机制.既然 ...

  4. 6月15日 python学习总结 Django模板语言相关内容

    Django模板语言相关内容   Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} ...

  5. Python攻关之Django(一)

    课程简介: Django流程介绍 Django url Django view Django models Django template Django form Django admin (后台数据 ...

  6. python框架之django

    python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django temple django models ...

  7. Python之路-(Django进阶一)

    Django请求生命周期: 首先,客户端发送请求到服务器的urls库,通过匹配url后面的关键字,去找指定app里面的的view. 然后,app通过判断,拿到数据库数据和html模板文件. 最后,将拿 ...

  8. 第六篇:web之python框架之django

    python框架之django   python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django te ...

  9. Django rest framework(7)----分页

    目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...

  10. Python web(Django)连接Sql server

    (开开心心每一天~ ---虫瘾师) Python Web(Django) 与SQL SERVRE的连接----Come QQ群:607021567(里面有很多开源代码和资料,并且python的游戏也有 ...

随机推荐

  1. Redis哨兵、复制、集群的设计原理,以及区别

    广西SEO:谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. **哨兵(Sentinel):**可以管理多个Redis服务器,它提供了监控,提醒以及自 ...

  2. Linkage Disequilibrium|D‘|r2

    I.10 Other Measures of Linkage Disequilibrium 因为D的取值强烈地依赖于人为制定的等位基因频率(PA及PB),所以它不利于LD程度的比较.标准化的不平衡系数 ...

  3. XMemcached 中文api

    变更历史 2010-06-22 添加客户端分布和SASL验证两节,更新spring配置一节. 2010-06-23 添加maven依赖说明 2010-10-17 1.2.6 released 2011 ...

  4. 图像的手绘效果(Python)

    PIL库,Python Image Library PIL库是一个具有强大图像处理能力的第三方库 在命令行下的安装方法:pip install pillow from PIL import Image ...

  5. Linux虚拟机添加硬盘

    任务:添加1块硬盘,并且分1个区,挂载到/bak 第一.插上硬盘 第二.分区 第三.格式化(定义:文件系统的类型)  FAT,FAT32,NTFS,ext1,ext2,ext3,ext4,.... 第 ...

  6. HDU-4614 Vases and Flowers(线段树区间更新+二分查找)

    http://acm.hdu.edu.cn/showproblem.php?pid=4614 Time Limit: 4000/2000 MS (Java/Others)    Memory Limi ...

  7. [LC] 543. Diameter of Binary Tree

    Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a b ...

  8. Survey sampling

    Survey sampling \(\bullet\)What is survey sampling?(c.f.census survey)(c.f.:参考,查看,来源于拉丁语) \(\bullet\ ...

  9. jsonConfig用法

    1.先编写jsonConfig的初始化代码 private JsonConfig jsonConfig; public action构造方法() { jsonConfig = new JsonConf ...

  10. Socket设置超时时间

    主要有以下两种方式,我们来看一下方式1: Socket s=new Socket(); s.connect(new InetSocketAddress(host,port),10000); 方式2: ...