• python django 之 django自带的分页


    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爬虫基础之BeautifulSoup
    Python爬虫基础之requests
    Python爬虫基础之UrlError
    Python爬虫基础之Cookie
    module 'socket' has no attribute的解决方案
    ECS——CentOS7下使用yum安装MariaDB
    用 Python 定位特定类型文件
    django——文本编辑器
    解决文件路径的问题的总结
    Django——发送邮件
  • 原文地址:https://www.cnblogs.com/dream4567/p/8799780.html
Copyright © 2020-2023  润新知