• python+Django CRM客户关系管理系统开发(四)--分页功能开发


    一、分页功能开发

    前几章我们开发了首页,数据表展示页,以及数据过滤功能,这一节开发分页功能。

    如果数据比较多的情况,不可能都在一页显示,所以需要开发分页功能。

    二、分页功能,这里使用Django自带的分页。

    1、首先了解一下Django的分页:

     查看官方文档:https://docs.djangoproject.com/zh-hans/2.1/topics/pagination/

    objects = ['john', 'paul', 'george', 'ringo']
    p = Paginator(objects, 2)  #表示把这个列表每页展示两个
    p.num_pages  #计算总共有多少页
    type(p.page_range)
    <class 'range_iterator'> #计算页码范围,可以看出p.page_range这是个迭代器,翻到哪页就显示哪页的数据
    p.page_range
    range(1, 3) #计算页码范围,包含第一个,不包含最后一个数字
    >>> page1 = p.page(1) #实例化第一页这个对象,显示里边的值
    >>> page1
    <Page 1 of 2>
    >>> page1.object_list
    ['john', 'paul']
    >>> page2 = p.page(2)   #实例化第二页这个对象,这对象是有判断前一页,后一页,是否有其他页这些方法的,如果没有会报错
    >>> page2.object_list
    ['george', 'ringo']
    >>> page2.has_next()
    False
    >>> page2.has_previous()
    True
    >>> page2.has_other_pages()
    True
    >>> page2.next_page_number()
    Traceback (most recent call last):
    ...
    EmptyPage: That page contains no results
     

    Django官方用法实例:假如有一个合同数据表,里边有许多合同数据,给这个数据分页
    视图函数:
    from django.shortcuts import render
    
    def listing(request):
        contact_list = Contacts.objects.all()   #得到所有的数据集合
        paginator = Paginator(contact_list, 25) # Show 25 contacts per page #分页
    
        page = request.GET.get('page') #得到当前页码
        contacts = paginator.get_page(page)  #当前页码 对应页面显示的数据集合
        return render(request, 'list.html', {'contacts': contacts})
    templates用法实例:
    {% for contact in contacts %}

    {# Each "contact" is a Contact model object. #}
        {{ contact.full_name|upper }}<br>
        ...
    {% endfor %}
    
    <div class="pagination">
        <span class="step-links">
            {% if contacts.has_previous %}
                <a href="?page=1">&laquo; first</a>
                <a href="?page={{ contacts.previous_page_number }}">previous</a>
            {% endif %}
    
            <span class="current">
                Page {{ contacts.number }} of {{ contacts.paginator.num_pages }}.
            </span>
    
            {% if contacts.has_next %}
                <a href="?page={{ contacts.next_page_number }}">next</a>
                <a href="?page={{ contacts.paginator.num_pages }}">last &raquo;</a>
            {% endif %}
        </span>
    </div>

    2、通过以上官方文档讲解,基本可以明白,用法就是对于 一堆数据集合,给它分页,然后通过request得到当前页,然后把当前页的数据显示到当前页面上,然后使用分页的next,previous等方法,显示上一页和下一页

    接下来具体开发:

    修改视图函数:

    在HTML上添加如下代码:

    显示效果如图:

     但是点击next时,会报错,原因是把页码当成了过滤查询条件:

    需要作如下修改:

    修改后,可以正常翻页:

     3、这么显示比较简陋,给它修改一下:

    还是从bootstrap上使用,比较方便:https://v3.bootcss.com/components/#pagination

    我们使用这个分页,能调节按钮大小:

    <nav aria-label="...">
      <ul class="pagination">
        <li class="disabled"><a href="#" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>
        <li class="active"><a href="#">1 <span class="sr-only">(current)</span></a></li>
        ...
      </ul>
    </nav>

    具体美化目前不是很懂,先参考一下别人写的:

    tags:

     html页面:

    显示效果如图:

    五、功能完善

    1、之前只开发了设置了自定义的表的数据展示,没有添加自定义的表,点开没有数据展示,这里完善一下。

     这里需要修改build_table_row,

    修改后效果如图,数据显示正确,但是多了个过滤按钮:

    这个按钮是前端显示的,因此在前端加一个判断:

    有自定义过滤的就显示过滤,没有的就不显示

    修改后显示效果如图:

     2、每个表对应的应用名字,之前使用APP_NAME代替,现在给它显示出来:

    由于前端不能显示下划线,因此还是通过tag返回给前端

     

    显示效果如图:

    每个表再加一个表名:

     

    显示效果如图:

  • 相关阅读:
    第十三章 类继承
    第十一章 使用类
    第十章 对象和类
    第九章 内存模型和名称空间
    第八章 函数幽探
    史上最详细得虚拟机安装过程,傻瓜式操作
    JVM内存结构图表展示
    主流消息队列rocketMq,rabbitMq比对使用
    springboot+druid+mybatis plus的多数据源配置
    linux服务器开放防火墙和端口,以及查询状态
  • 原文地址:https://www.cnblogs.com/realizetomoney/p/13874734.html
Copyright © 2020-2023  润新知