Django分页(二)

Django分页(二)

要求

# 1、设定每页显示数据条数
#
# 2、用户输入页码(第一页、第二页...)
#
# 3、设定显示多少页号
#
# 4、获取当前数据总条数
#
# 5、根据设定显示多少页号和数据总条数计算出,总页数
#
# 6、根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置
#
# 7、在数据表中根据起始位置取值,页面上输出数据
#
# 8、输出分页html,如:[上一页][1][2][3][4][5][下一页]

具体实现效果

css样式可以自行修改

示例

页面具体处理

# 参数:
#数据总个数
#当前页
#每页显示多少条数据
#最多每页多个页号

class PageInfo(object):
    def __init__(self,totalCount,current,totalItem=12,peritems=10):
        #数据总个数
        self._count=totalCount
        #当前页
        try:

            v=int(current)
            if v<=0:
                v=1
            self.__current=v
        except Exception as e:
            self.__current = 1
        #每页显示的行数
        self.__totalItem=totalItem
        #最多显示页面
        self.__peritems = peritems


#设置一页数据的开始和结束
#数据开始的页数
    def start(self):
        return (self.__current-1)*self.__totalItem
#数据结束的页数
    def end(self):
        return self.__current*self.__totalItem

#求出总页数
    @property
    def num_pages(self):

        a,b=divmod(self._count,self.__totalItem)
        # print(a,b)
        if b==0:
            return a
        return a+1

#生成所有的页号
    def page_num_range(self):
        # 当前页面
        # self.current_page
        # 总页数
        # self.num_pages
        # 最多显示的页码个数
        # self.max_pager_num
        if self.num_pages <  self.__peritems:
            return range(1, self.num_pages + 1)
        part = int(  self.__peritems/ 2)
        if self.__current - part < 1:
            return range(1,  self.__peritems + 1)
        if self.__current + part > self.num_pages:
            return range(self.num_pages + 1 -  self.__peritems, self.num_pages + 1)
        return range(self.__current - part, self.__current + part + 1)
#所有的a标签
    def page_str(self):

        #用来存放所有页号a标签
        page_list=[]

        #首页
        head_page="<a href='/index3?p=1'>首页</a>"
        page_list.append(head_page)

        #上一页
        print(self.__current)
        if self.__current ==1:

            prev="<a href='#'><<</a>"
        else:
            prev="<a href='/index3?p=%s'><<</a>"%(self.__current-1)

        page_list.append(prev)
        for i in self.page_num_range():
            if i==self.__current:
                temp="<a style='font-size:30px;' href='/index3?p=%s'>%s</a>"%(i,i)
            else:
                temp="<a href='/index3?p=%s'>%s</a>"%(i,i)
            page_list.append(temp)

        #下一页
        if self.__current==self.num_pages:
            next = "<a href='#'>>></a>"
        else:
            next = "<a href='/index3?p=%s'>>></a>" % (self.__current + 1)

        page_list.append(next)

        # 尾页
        b_page="<a href='/index3?p=%s'>尾页</a>"%( self.num_pages)
        page_list.append(b_page)
        return ''.join(page_list)
View Code

视图函数

from django.shortcuts import render,HttpResponse,redirect
from blog.models import *
from blog import pager
# Create your views here.
USER_LIST=[]
for i in range(666):
    temp={'name':'root'+str(i),'age':i}
    USER_LIST.append(temp)

def get_index3(request):
    current_page=request.GET.get('p')
    
    #初始化页面处理的对象,有两个参数在初始化函数里,设置了默认数值
    page_obj=pager.PageInfo(666,current_page)
    
    #对数据进行切片
    data_list=USER_LIST[page_obj.start():page_obj.end()]

    return render(request,"index3.html",{'data_list':data_list,"page_obj":page_obj})
View Code

HTML

注意:safe在这里的作用。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        a{
      border-style: solid ;
      }

    </style>
</head>
<body>
<div class="header">
    <div>
        {% for user in data_list %}
            <li>{{ user.name }} {{ user.age }} </li>
        {% endfor %}
      <br>
        {{ page_obj.page_str | safe }}
    </div>

</div>
</body>
</html>
View Code
原文地址:https://www.cnblogs.com/-wenli/p/10459932.html