本节内容

自定义一个简单的内置分页

Django内置分页

Django内置分页扩展(继承)

自定义内置组件


自定义一个简单的内置分页


先用django自己自定制一个简单的内置分页,大概掌握内置分页的底层原理之后,自己就可以扩展分页。

首先定义每页分页为10,每当用户GET访问 ?p=1 时或其他 只展示10 行数据

然后对原来的数据USER_LIST进行切片,按照用户GET访问定制的p为何值时展示start到end之间的索引值

这里使用了简单的数学公式 ,计算出start和end后再传给render渲染


USER_LIST = []for i in range(1,999):    d = {"name":"root"+str(i),"age":i}    USER_LIST.append(d)

def index(request):
    per_page_count = 10
    current_page= request.GET.get("p")
    current_page = int(current_page)

    start = (current_page-1)*per_page_count
    end = current_page*per_page_count

    return  render(request,"index.html",{"USER_LIST":USER_LIST[start:end]})

Django内置分页

Paginator(L,10)第一个参数为传入的数据,第二个为每页显示的数据条数

Paginator下封装了许多方法,其中还封装了page对象,page对象下还封装了Paginator对象,可以让page对象再调用回来

from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

L = []
for i in range(999):
    L.append(i)

def index(request):
    current_page = request.GET.get('p')

    paginator = Paginator(L, 10)
    # per_page: 每页显示条目数量
    # count:    数据总个数
    # num_pages:总页数
    # page_range:总页数的索引范围,如: (1,10),(1,200)
    # page:     page对象
    try:
        posts = paginator.page(current_page)  #对当前页进行切片
        # has_next              是否有下一页
        # next_page_number      下一页页码
        # has_previous          是否有上一页
        # previous_page_number  上一页页码
        # object_list           分页之后的数据列表
        # number                当前页
        # paginator             Paginator对象
    except PageNotAnInteger:
        posts = paginator.page(1)
    except EmptyPage:
        posts = paginator.page(paginator.num_pages)
    return render(request, 'index.html', {'posts': posts})

Django内置分页扩展(继承)

我们来自定制一个功能:若总页数为100页时,让第11页中间显示   7,8,9,10,11,12,13,14,15


自定制一个CustomPaginator类继承Paginator类就可以自定制一个我们需要的分页组件

在CustomPaginator中我们定义了页数范围:定义页数范围首先分为两种情况

  • 总页数特别少时:总页数少于最多可用于显示的页数时——>直接显示总页数
  • 总页数特别多时:又分3种情况

总页数特别多时

当前页数处于1,2,3较排头的页数时,没必要让其居中显示——>直接显示 1---最大可用于显示的页数   (区间均为:最大可用于显示的页数)

当前页数特别大,处于排尾的页数,直接显示——>  总页数减去最大可用于显示的页数 ---总页数    (区间均为:最大可用于显示的页数)

当前页数处于中间部分——>当前页数减去最大可用于显示的页数的一半 --- 当前页数加上最大可用于显示的页数的一半   (区间均为:最大可用于显示的页数)

class CustomPaginator(Paginator):
    def __init__(self, current_page, max_pager_num, *args, **kwargs):
        """
        :param current_page: 当前页
        :param max_pager_num:最多显示的页码个数
        :param args:
        :param kwargs:
        :return:
        """
        self.current_page = int(current_page)
        self.max_pager_num = max_pager_num
        super(CustomPaginator, self).__init__(*args, **kwargs)

    def page_num_range(self):
        # 当前页面
        # self.current_page
        # 总页数
        # self.num_pages
        # 最多显示的页码个数
        # self.max_pager_num
        print(1)     #当总页数少于最多可显示的页码个数时,就直接显示总页数就行
        if self.num_pages < self.max_pager_num:
            return range(1, self.num_pages + 1)
        print(2)     #以下是当前页数特别多的时候的情况
        part = int(self.max_pager_num / 2)     #当前页数特别小的时候,例如1,2,3。。小于每页可显示的最多页数的一半的时候
        if self.current_page - part < 1:
            return range(1, self.max_pager_num + 1)
        print(3)     #当前页数特别大的时候,接近总页数的时候
        if self.current_page + part > self.num_pages:
            return range(self.num_pages + 1 - self.max_pager_num, self.num_pages + 1)
        print(4)
        return range(self.current_page - part, self.current_page + part + 1)

L = []
for i in range(999):
    L.append(i)

def index(request):
    current_page = request.GET.get('p')
    paginator = CustomPaginator(current_page, 11, L, 10)
    # per_page: 每页显示条目数量
    # count:    数据总个数
    # num_pages:总页数
    # page_range:总页数的索引范围,如: (1,10),(1,200)
    # page:     page对象
    try:
        posts = paginator.page(current_page)
        # has_next              是否有下一页
        # next_page_number      下一页页码
        # has_previous          是否有上一页
        # previous_page_number  上一页页码
        # object_list           分页之后的数据列表
        # number                当前页
        # paginator             paginator对象
    except PageNotAnInteger:
        posts = paginator.page(1)
    except EmptyPage:
        posts = paginator.page(paginator.num_pages)

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

自定义内置组件

html用法 :{ page_obj.page_str|safe }}

class Pagination(object):
    def __init__(self,totalCount,currentPage,perPageItemNum=30,maxPageNum=7):
        #数据总个数
        self.total_count = totalCount

        #当前页
        try:
            v = int(currentPage)
            if v <= 0:
                self.current_page =1
            self.current_page = v
        except Exception as e:
            self.current_page = 1

        #每页显示的数据数
        self.per_page_item_num = perPageItemNum
        self.max_page_num = maxPageNum

    def start(self):
        return (self.current_page-1) * self.per_page_item_num
    def end(self):
        return self.current_page * self.per_page_item_num

    @property
    def num_pages(self):
        """
        总页数
        :return:
        """
        #数据总个数除于每页显示的行数,得商与余数
        a,b = divmod(self.total_count,self.per_page_item_num)
        if b==0:
            return a
        return a+1

    def page_num_range(self):
        print(1)
        if self.num_pages < self.max_page_num:
            return range(1, self.num_pages + 1)
        print(2)
        part = int(self.max_page_num / 2)
        if self.current_page - part < 1:
            return range(1, self.max_page_num+ 1)
        print(3)

        if self.current_page + part > self.num_pages:
            return range(self.num_pages + 1 - self.max_page_num, self.num_pages + 1)
        print(4)
        return range(self.current_page - part, self.current_page + part + 1)

    def page_str(self):
        page_list = []

        first = '<li><a href="/index2.html?p=1">首页</a></li>'
        page_list.append(first)

        if self.current_page == 1:
            prev = '<li><a href="#">上一页</a></li>'
        else:
            prev = '<li><a href="/index2.html?p=%s">上一页</a></li>' % (self.current_page-1)
        page_list.append(prev)

        for i in self.page_num_range():
            if i == self.current_page:
                temp = "<li class ='active'><a href='/index2.html?p=%s' >%s</a></li>"%(i,i)
            else:
                temp = "<li><a href='/index2.html?p=%s'>%s</a></li>" % (i, i)
            page_list.append(temp)

        if self.current_page == self.num_pages:
            nex = '<a href="#">下一页</a>'
        else:
            nex = '<a href="/index2.html?p=%s">下一页</a>' % (self.current_page+1)
        page_list.append(nex)

        last = '<a href="/index2.html?p=%s">尾页</a>' % self.num_pages
        page_list.append(last)

        #列表迭代空格分割拼接
        return ''.join(page_list)

django的内置分页的更多相关文章

  1. Django内置分页

    一.django内置分页 from django.shortcuts import render from django.core.paginator import Paginator, EmptyP ...

  2. Djang内置分页和自定义分页

    内置分页 views from django.core.paginator import Paginator,Page,PageNotAnInteger def DJs_pages(request): ...

  3. django的内置信号

    Model singnalspre_init 在model执行构造方法之前自动触发post_init django的model在执行构造方法之后,自动触发pre_save django的对象保存之前, ...

  4. Django的内置登录、退出、修改密码方法

    Django中内置的登录.退出.修改密码方法. 1.url.py中使用django.contrib.auth中的views函数,django.views.generic中的TemplateView函数 ...

  5. Django 使用 内置 content-type

    django内置的content-type组件, 记录了项目中所有model元数据的表 可以通过一个ContentType表的id和一个具体表中的id找到任何记录,及先通过ContenType表的id ...

  6. Django扩展内置User类

    内置User类 使用内置User可以方便实现登录验证,利用Admin管理界面还可以方便添加.删除.修改用户. 一个内置的User类定义了以下字段: username: 用户名 password: 密码 ...

  7. Django 内置分页的简单使用

    1, 文档 https://docs.djangoproject.com/en/1.11.1/topics/pagination/ 2,视图 from django.core.paginator im ...

  8. Django 内置分页--Paginator类

    官方文档 http://python.usyiyi.cn/django/topics/pagination.html 前端方法 http://www.tuicool.com/articles/RniU ...

  9. Django,ajax实现表格增删查改,Django内置分页功能。

    1.工程目录 2.urls.py """Django_ajax URL Configuration The `urlpatterns` list routes URLs ...

随机推荐

  1. 深入理解 ORM框架

    1.ORM是什么? object Relational mapping 对象关系映射,是一种为了解决面向对象与关系型数据库存在不匹配现象的技术,简单说,orm通过描述对象和数据库之间映射的元数据,将程 ...

  2. Opencv 图像读取与保存问题

    转自 @yhl_leo 1 图像读取 首先看一下,imread函数的声明: // C++: Mat based Mat imread( ); // C: IplImage based IplImage ...

  3. 复制虚拟机vmware centos搭建集群节点过程中网络配置eth0和eth1遇到的问题以及NAT模式下虚拟机静态IP配置方法

    在centos中安装完第一个虚拟机后,一般习惯通过克隆的方式创建其它虚拟机,开后vmware无法发现网卡信息,系统认为这是重新安装,所以重新创建了一个新的网卡叫eth1. 并且用IFCONFIG-a查 ...

  4. RAMOS (内存操作系统)-无忧百科(不断完善中)

    RAMOS (内存操作系统)-无忧百科(不断完善中) - RAMOS - 无忧启动论坛 - Powered by Discuz! http://bbs.wuyou.net/forum.php?mod= ...

  5. thinkphp框架 的 链接数据库和操作数据

    框架有时会用到数据库的内容,在"ThinkPhp框架知识"的那篇随笔中提到过,现在这篇随笔详细的描述下. 一.链接数据库 (1)找到模块文件夹中的Conf文件夹,然后进行编写con ...

  6. Warning: mysqli_connect(): The server requested authentication method unknown to the client [caching_sha2_password]报错解决方法

    错误: 解决方法:

  7. Intellij IDEA超好用的快捷键

    1.首推 Ctrl+Shift+Enter,自动跳出括号,在行尾添加分号,并自动回车. 2.Ctrl+Shift+J,将多行代码折叠成一行. 当你遇到的时候,这个快捷键非常实用.比如你在写painle ...

  8. <<让你自己的APP成为系统应用>>所遇到的问题及解决方法

    1.adb connect 10.100.1.772.adb -s 10.100.1.77 shell remount3.让你自己的APP成为系统应用 adb push xxx.apk system/ ...

  9. IE8图片上传预览

    $("#smallImg").attr('style', "filter:progid:DXImageTransform.Microsoft.AlphaImageLoad ...

  10. mybatis入门篇:Mybatis高级查询

    1.ResultMap的association与collection association与collection功能类似,区别是一对一与一对多,这里以association为例. 首先说明一下需求: ...