• django分页功能实现


    简单版:

    1,views

    from django.shortcuts import render,HttpResponse
    from django.utils.safestring import mark_safe
    # Create your views here.
    
    def page(request):
        list = []   #要发给前端的数据列表
        page_list = []  #存放页码地址的列表
        for i in range(1,109):
            list.append(i)
        dis_count = 10  #每页显示条数
        count = len(list)
        cur_page = request.GET.get('page')
        if not cur_page:
            cur_page = 1
        start = (int(cur_page)-1)*dis_count
        end = int(cur_page)*dis_count
        data = list[start:end]
        x,y = divmod(count,dis_count)  #求模取余,如果余数不为0,模数要加1页
        if y:
            x += 1
        for j in range(1,x+1):
            if j==int(cur_page):
                str = '<a class="active" href="/page?page=%s">%s</a>' % (j, j)
            else:
                str = '<a href="/page?page=%s">%s</a>' %(j,j)
            str = mark_safe(str)
            page_list.append(str)
        return render(request,'page.html',{'list':data,'page_list':page_list})
    View Code

    2,template

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .active{
                background-color: aquamarine;
            }
        </style>
    </head>
    <body>
    <ui>
        {% for i in list %}
            <li>{{ i }}</li>
        {% endfor %}
    </ui>
    {% for j in page_list %}
        {{ j }}
    {% endfor %}
    </body>
    </html>
    View Code

    高级版:

    1,views

    from django.shortcuts import render,HttpResponse
    from django.utils.safestring import mark_safe
    # Create your views here.
    
    def page(request):
        list = []   #要发给前端的数据列表
        page_list = []  #存放页码地址的列表
        dis_pagelist = [] #底侧导航条内容,发送到前端的
        for i in range(1,779):
            list.append(i)
        dis_count = 10  #每页显示条数
        count = len(list)
        cur_page = int(request.GET.get('page'))
        if not cur_page:
            cur_page = 1
        start = (cur_page-1)*dis_count
        end = cur_page*dis_count
        data = list[start:end]
        x,y = divmod(count,dis_count)  #求模取余,如果余数不为0,模数要加1页
        if y:
            x += 1
        for j in range(1,x+1):
            if j==cur_page:
                str = '<a class="active" href="/page?page=%s">%s</a>' % (j, j)  #当前活动面前加个class
            else:
                str = '<a href="/page?page=%s">%s</a>' %(j,j)
            str = mark_safe(str)
            page_list.append(str)
        #以下是页码超过7页则只显示7页
        tray_len = 7   #定义显示页面长度,注意只能为单数
        if x < tray_len:
            dis_pagelist = page_list[0:x]
        else:
            if cur_page<(tray_len+1)/2:
                dis_pagelist = page_list[0:tray_len]
            elif cur_page>x-(tray_len+1)/2:
                dis_pagelist = page_list[x-tray_len:x]
            else:
                dis_pagelist = page_list[int(cur_page-(tray_len+1)/2):int(cur_page+(tray_len+1)/2-1)]
    
        dianti = '<span>跳转:</span><select id="dianti">'
        for ii in range(1,len(page_list)+1):
            temp = '<option>'+repr(ii)+'</option>'
            dianti = dianti + temp
        dianti = dianti + '</select>'
        dis_pagelist.insert(0,mark_safe(dianti))
    
        dis_pagelist.insert(1,mark_safe('<a href="/page?page=1">首页</a>'))
        if cur_page==1:
            prepage='<a href="/page?page='+repr(cur_page)+'">上一页</a>'
        else:
            prepage = '<a href="/page?page=' + repr(cur_page - 1) + '">上一页</a>'
        dis_pagelist.insert(2,mark_safe(prepage))
        if cur_page==x:
            nextpage='<a href="/page?page='+repr(cur_page)+'">下一页</a>'
        else:
            nextpage='<a href="/page?page='+repr(cur_page+1)+'">下一页</a>'
        dis_pagelist.append(mark_safe(nextpage))
        lastpage='<a href="/page?page='+repr(x)+'">尾页</a>'
        dis_pagelist.append(mark_safe(lastpage))
    
        return render(request,'page.html',{'list':data,'dis_list':dis_pagelist,})
    

    2,template

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .active{
                background-color: aquamarine;
            }
        </style>
    </head>
    <body>
    <ui>
        {% for i in list %}
            <li>{{ i }}</li>
        {% endfor %}
    </ui>
    
    {% for j in dis_list %}
        {{ j }}
    {% endfor %}
    
    <script src="/static/jquery-3.3.1.js"></script>
    <script>
        $('#dianti').change(function () {
            location.href="/page?page="+$('#dianti').val();
        })
    </script>
    </body>
    </html>
    

    模块版:

    1,在项目下创建一个utils目录,里面创建paginations.py并写入以下内容。

    #!_*_coding:utf-8_*_
    #__author__:"Alex huang"
    from django.utils.safestring import mark_safe
    class page_mod:
        def __init__(self,data,dis_count=10,tray_len=7,cur_page=1):
            self.data=data   #data应为一个列表,值为要显示的所有数据
            self.dis_count=dis_count    #设置每页显示数据条数
            self.tray_len=tray_len      #设置下边导航页的长度,值为基数
            self.cur_page=cur_page   #当前显示页
            self.data_num=len(data)
            self.list = []  # 要发给前端的数据列表
            self.page_list = []  # 存放导航页码地址的列表
    
        @property   #加了此装饰器,在对象调用时,可以不带括号,使代码美观
        def start(self):   #返回指定页面cur_page的数据开始位置
            return (self.cur_page-1)*self.dis_count
    
        @property
        def end(self):    #返回指定页面cur_page的数据结束位置
            return self.cur_page*self.dis_count
    
        @property    #每页要显示的具体那10条数据列表
        def per_page_data(self):
            return self.data[self.start:self.end]
    
        @property
        def nav_num(self):   #下方导航超链的个数
            x, y = divmod(self.data_num, self.dis_count)  # 求模取余,如果余数不为0,模数要加1页
            if y:
                x += 1
            return x
    
        def page_str(self,base_url):   #生成发给前端的导航列表字符串,base_url为获取分布的url
            for j in range(1, self.nav_num + 1):
                if j == self.cur_page:
                    str = '<a style="background-color: grey" href="%s?page=%s">%s</a>' % (base_url,j,j)  # 当前活动页面前加个底色
                else:
                    str = '<a href="%s?page=%s">%s</a>' % (base_url,j,j)
                str = mark_safe(str)    #将发送给前端的字符串标记为安全的,防止xss攻击拦截。
                self.page_list.append(str)    #生成所有导航超链,如果内容过多,还需要剪栽,只显示规定长度
            # 以下是页码超过7页则只显示7页,7为默认tray_len值
            if self.nav_num < self.tray_len:
                dis_pagelist = self.page_list[0:self.nav_num]    #总导航长度小于7
            else:
                if self.cur_page < (self.tray_len + 1) / 2:
                    dis_pagelist = self.page_list[0:self.tray_len]    #当前页是导航前几页时,为了保持导航页始终等于7
                elif self.cur_page > self.nav_num - (self.tray_len + 1) / 2:
                    dis_pagelist = self.page_list[self.nav_num - self.tray_len:self.nav_num]   #当前页是导航最后几页时,为了保持导航页始终等于7
                else:
                    dis_pagelist = self.page_list[int(self.cur_page - (self.tray_len + 1) / 2):int(self.cur_page + (self.tray_len + 1) / 2 - 1)]   #导航条显示当前页的前后各四页
    
            dianti = '<span>跳转:</span><select id="dianti">'
            for ii in range(1, len(self.page_list) + 1):
                temp = '<option>' + repr(ii) + '</option>'
                dianti = dianti + temp
            dianti = dianti + '</select>'
            dis_pagelist.insert(0, mark_safe(dianti))
    
            dis_pagelist.insert(1, mark_safe('<a href="%s?page=1">首页</a>' %base_url))
            if self.cur_page == 1:
                prepage = '<a href="%s?page=' %base_url + repr(self.cur_page) + '">上一页</a>'
            else:
                prepage = '<a href="%s?page=' %base_url + repr(self.cur_page - 1) + '">上一页</a>'
            dis_pagelist.insert(2, mark_safe(prepage))
            if self.cur_page == self.nav_num:
                nextpage = '<a href="%s?page=' %base_url + repr(self.cur_page) + '">下一页</a>'
            else:
                nextpage = '<a href="%s?page=' %base_url + repr(self.cur_page + 1) + '">下一页</a>'
            dis_pagelist.append(mark_safe(nextpage))
            lastpage = '<a href="%s?page=' %base_url + repr(self.nav_num) + '">尾页</a>'
            dis_pagelist.append(mark_safe(lastpage))
    
            return dis_pagelist
    

    2,在视图里调用views:

    from django.shortcuts import render,HttpResponse
    from django.utils.safestring import mark_safe
    # Create your views here.
    from utils import paginations
    
    def page(request):
        list = []   #生成要发给前端的数据列表
        for i in range(1,779):
            list.append(i)
    
        cur_page = request.GET.get('page')
        if not cur_page:
            cur_page = 1
        else:
            cur_page = int(cur_page)
    
        obj = paginations.page_mod(data=list,cur_page=cur_page,dis_count=10,tray_len=7)
        data = obj.per_page_data    #分页后的内容
        nav_str = obj.page_str("/page")   #分布后的导航
    
        return render(request,'page.html',{'list':data,'dis_list':nav_str})
    

    3,前端templates页面page.html: 

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <ui>
        {% for i in list %}
            <li>{{ i }}</li>
        {% endfor %}
    </ui>
    
    {% for j in dis_list %}
        {{ j }}
    {% endfor %}
    
    <script src="/static/jquery-3.3.1.js"></script>
    <script>
        $('#dianti').change(function () {
            location.href="/page?page="+$('#dianti').val();
        })
    </script>
    </body>
    </html>
    

      上面js代码是调用后端发过来的

  • 相关阅读:
    C++学习基础十六-- 函数学习笔记
    OpenGL ES平移矩阵和旋转矩阵的左乘与右乘效果
    C++学习基础十五--sizeof的常见使用
    C++学习基础十四——基础类型vector
    XDGE_DefalutLit 物理渲染总结-01
    XDGEUnity XDGEPipeLine
    XDGE Render-启程
    一次BSSDF引发的惨案----搬家狂删除
    XDGE_RayMarchine 1- 利用Frag Shader绘制图形
    XDGE_AccelerationAlgorithms 01
  • 原文地址:https://www.cnblogs.com/alex-hrg/p/10175102.html
Copyright © 2020-2023  润新知