博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

django分页功能实现

Posted on 2018-12-25 17:02  alex_hrg  阅读(212)  评论(0编辑  收藏  举报

简单版:

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代码是调用后端发过来的