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. 爬虫—文件存储—CSV存储

    一,简介 CSV,全称Comma—Separated Values,可以称为逗号分隔或者字符分隔值,其文件以纯文本形式存储表格数据.该文件是一个字符序列,可以有任意的数目记录组成,记录间已某种换行符分 ...

  2. php 连接oracle插入多张图片的方法

    php连接oracle数据库的时候,其查询.更新.删除数据和MySQL类似,但是增加数据.特别是图片的时候就很不一样,这里面涉及到要创建一个blob对象,用blod对象去保存php图片,下面是当插入多 ...

  3. centos7_安装jira7

    centos7 安装jira7 参考文档:http://www.cnblogs.com/kevingrace/p/7608813.html 1.准备环境 centos7 memory:8G stora ...

  4. trie(字典树)原理及C++代码实现

    字典树,又称前缀树,是用于存储大量字符串或类似数据的数据结构. 它的原理是利用相同前缀来减少查询字符串的时间. 不同于BST把关键字保存在本结点中,TRIE可以想象成把关键字和下一个结点的指针绑定,事 ...

  5. 2018 ACM-ICPC 宁夏 C.Caesar Cipher(模拟)

    In cryptography, a Caesar cipher, also known as the shift cipher, is one of the most straightforward ...

  6. moco jar包下载

    http://repo1.maven.org/maven2/com/github/dreamhead/moco-runner/0.11.0/ 选择moco-runner-0.11.0-standalo ...

  7. 实验报告8 AC+Fit AP组网通过三层网络注册(DHCP Option 43)

    实验报告8 课程名称 无线网络与安全技术 实验名称 AC+Fit AP组网通过三层网络注册(DHCP Option 43) 姓名 学号 班级 实 验 目 的   [实验目的] 了解AC+Fit AP跨 ...

  8. 43)PHP,mysql_fetch_row 和mysql_fetch_assoc和mysql_fetch_array

    mysql_fetch_row   提取的结果是没有查询中的字段名了(也就是没有键id,GoodsName,只有值),如下图: mysql_fetch_assoc 提取的结果有键值,如下图: mysq ...

  9. C - The Battle of Chibi HDU - 5542 (树状数组+离散化)

    Cao Cao made up a big army and was going to invade the whole South China. Yu Zhou was worried about ...

  10. OA项目-xadmin使用

    ###############  xadmin安装和配置   ############### """ 环境: Python3.6.3 django1.11.11 创建dj ...