分页

分页开始

第一部分

伪造数据,第一图为显示所有数据,第二图为按照自定义显示数据,传给前端进行渲染

       

后端

from django.shortcuts import render
显示所有数据:
    HOST_LIST = []
    # 数据库没数据,伪造数据
    for i in range(1,150):
        HOST_LIST.append("c%s.com" %i )
    def hosts(request):
        return render(request,'hosts.html',{'host_list':HOST_LIST})

显示十条数据:
HOST_LIST = []
# 数据库没数据,伪造数据
for i in range(1,150):
    HOST_LIST.append("c%s.com" %i )
def hosts(request):
  #每页显示十条数据
  host_list = HOST_LIST[0:10]

    return render(request,'hosts.html',{'host_list':HOST_LIST})

前端
# 取出所有数据
<ul>
        {% for item in host_list %}
            <li>{{ item }}</li>
        {% endfor %}
    </ul>

 第二部分

 把用户看到的页码传出去,计算在数据库中获取的数据

HOST_LIST = []
for i in range(1,104):
    HOST_LIST.append("c%s.com" %i )
def hosts(request):
    #用户请求的当前页
    current_page = int(request.GET.get("page"))
    #  每页显示10条数据
    per_page_count = 10
    # 根据用户请求的数据,把切片的数据拿出来
    start = (current_page - 1) * per_page_count
    
    end = current_page * per_page_count

    host_list =HOST_LIST[start:end]  # 第一页

    return render(request,'hosts.html',{'host_list':host_list})

 第三部分

让用户看的舒服些,写上可以点的a标签

def host(request):
    try:
        current_page = int(request.GET.get("page",1))
    except Exception:
        current_page =1

    per_page_count = 10

    start = (current_page -1) * per_page_count
    end = current_page * per_page_count
    host_list = Host_list[start:end]


    #数据总条数
    total_count = len(Host_list)
    #页面显示的最大页码
    max_page_num,div = divmod(total_count,per_page_count)
    if div:
        max_page_num += 1   # 有余数所以+1

    page_html_list = []
    for i in range(1,max_page_num +1): # range取不到最后一个,所有需要+1
        if i == current_page:
            temp = '<a class="active" href="/hosts/?page=%s">%s</a>'%(i,i)
        else:
            temp = '<a href="/hosts/?page=%s">%s</a>' % (i, i)
        page_html_list.append(temp)
    page_html = "".join(page_html_list)

    return render(request,"host_list.html",{"host_list":host_list,"page_html":page_html})
View Code
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .pager a{
            display: inline-block;
            padding: 2px 8px;
            margin: 0 5px;
            border: 1px solid cadetblue;
        }
        .pager a.active{
            background-color: green;
            color: white;
        }
    </style>
</head>
<body>
    <ul>
        {% for item in host_list %}
            <li>{{ item }}</li>
        {% endfor %}
    </ul>
    <div class="pager">
        {{ page_html|safe }}
    </div>
</body>
</html>
HTML

 第四部分

数据庞大的时候会出现如图问题,显示指定页码和解决左右与页码的极限问题

from django.shortcuts import render

HOST_LIST = []
for i in range(1,852):
    HOST_LIST.append("c%s.com" %i )
def hosts(request):
    current_page = int(request.GET.get("page"))
    per_page_count = 10
    start = (current_page -1) * per_page_count
    end = current_page * per_page_count
    host_list = HOST_LIST[start:end]

    #数据总条数
    total_count = len(HOST_LIST)
    #页面显示的最大页码
    max_page_num,div = divmod(total_count,per_page_count)
    if div:
        max_page_num += 1
    # 最大页码的个数
    max_page_count = 11
    half_max_pager_count = int((max_page_count-1) /2)
    #如果总页数 < 11
    if max_page_num <= max_page_count:
        pager_start = 1
        pager_end = max_page_num
    else:
        # 如果当前页 <= 5,判断最小值
        if  current_page <= half_max_pager_count:
            pager_start = 1
            pager_end = max_page_count
        else:
            # 当前页 + 5 > 总页码 判断最大值
            if (current_page + half_max_pager_count) > max_page_num:
                pager_start = max_page_num - max_page_count +1
                pager_end = max_page_num
            else:
                pager_start = current_page - half_max_pager_count
                pager_end = current_page + half_max_pager_count
    page_html_list = []
    for i in range(pager_start,pager_end +1):
        if i == current_page:
            temp = '<a class="active" href="/hosts/?page=%s">%s</a>'%(i,i,)
        else:
            temp = '<a href="/hosts/?page=%s">%s</a>' % (i, i,)
        page_html_list.append(temp)
    page_html = "".join(page_html_list)

    return render(request,"hosts.html",{"host_list":host_list,"page_html":page_html})
View Code

 第五部分

最终生成页码时,做一次封装,创建一个模块,如果想封装,以后写类的时候,想要start值,需要根据某种计算结果得到

"""
自定义分页组件的使用方法:
    page_obj = Pagination(request.GET.get('page',1),len(USER_LIST),request.path_info)
    user_list = USER_LIST[page_obj.start:page_obj.end]
    html = page_obj.page_html()
    return render(request,"users.html",{"user_list":user_list,"page_html":html})
"""





class Pagination(object):
    """
    自定义分页
    """
    def __init__(self,current_page,total_count,base_url,per_pager_count=10,max_pager_count = 11):
        #处理当前页
        try:
            current_page = int(current_page)

        except Exception as e:
            current_page =1
        if current_page <= 0:
            current_page = 1


        self.current_page = current_page
        #数据总条数
        self.total_count = total_count

        #每页显示自定义数据条数
        self.per_pager_count = per_pager_count

        # 页面显示的最大页码
        max_page_num, div = divmod(total_count, per_pager_count)
        if div:
            max_page_num += 1
        self.max_page_num = max_page_num

        # 页面默认显示11个页面(当前页在中间)
        self.max_pager_count = max_pager_count
        self.half_max_pager_count = int((max_pager_count - 1) / 2)

        #前缀
        self.base_url = base_url
    @property
    def start(self):

        return (self.current_page - 1) * self.per_pager_count
    @property
    def end(self):

        return self.current_page * self.per_pager_count

    def page_html(self):

        # 如果总页数 < 11
        if self.max_page_num <= self.max_pager_count:
            pager_start = 1
            pager_end = self.max_page_num
        else:
            # 如果当前页 <= 5,判断最小值
            if self.current_page <= self.half_max_pager_count:
                pager_start = 1
                pager_end = self.max_pager_count
            else:
                # 当前页 + 5 > 总页码 判断最大值
                if (self.current_page + self.half_max_pager_count) > self.max_page_num:
                    pager_start = self.max_page_num - self.max_pager_count + 1
                    pager_end = self.max_page_num
                else:
                    pager_start = self.current_page - self.half_max_pager_count
                    pager_end = self.current_page + self.half_max_pager_count
        page_html_list = []
        for i in range(pager_start, pager_end + 1):
            if i == self.current_page:
                temp = '<a class="active" href="%s?page=%s">%s</a>' % (self.base_url,i, i,)
            else:
                temp = '<a href="%s?page=%s">%s</a>' % (self.base_url,i, i,)
            page_html_list.append(temp)
        return "".join(page_html_list)
pager.py
from django.shortcuts import render

HOST_LIST = []
for i in range(1,852):
    HOST_LIST.append("c%s.com" %i )

from utils.pager import Pagination
def hosts(request):
    # 表示把所有的值都封装到对象里
    page_obj = Pagination(request.GET.get('page',1),len(HOST_LIST),request.path_info)    # request.path_info 获取当前url
    # 把数据库的数据切出来
    host_list = HOST_LIST[page_obj.start:page_obj.end]
    html = page_obj.page_html()
    return render(request,"hosts.html",{"host_list":host_list,"page_html":html})
USER_LIST =[]
for i in range(1,302):
    USER_LIST.append("bb%s" %i )

def users(request):
    page_obj = Pagination(request.GET.get('page',1),len(USER_LIST),request.path_info)

    user_list = USER_LIST[page_obj.start:page_obj.end]
    html = page_obj.page_html()
    return render(request,"users.html",{"user_list":user_list,"page_html":html})
View Code

 首页与尾页设定

 

 #首页设定
        first_page = '<a href="%s?page=%s">首页</a>' % (self.base_url,1,)
        page_html_list.append(first_page)
        for i in range(pager_start, pager_end + 1):
            if i == self.current_page:
                temp = '<a class="active" href="%s?page=%s">%s</a>' % (self.base_url,i, i,)
            else:
                temp = '<a href="%s?page=%s">%s</a>' % (self.base_url,i, i,)
            page_html_list.append(temp)
 #尾页设定
        last_page = '<a href="%s?page=%s">尾页</a>' % (self.base_url, self.max_page_num,)
        page_html_list.append(last_page)

 

posted @ 2017-12-19 21:01  丶陌潇  阅读(69)  评论(0)    收藏  举报