自定义分页

自定义分页

准备知识点:

  Python内置的@property装饰器就是负责把一个方法变成属性调用的:

class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    @property
    def show(self):  #  把一段代码逻辑封装起来
        if self.age > 18:
            return "上酒吧"
        else:
            return "上网吧"

jassin = Person("jassin",18) # 实例化对象
print(jassin.name)  # jassin
print(jassin.show)   # 上网吧

简单版分页

from django.shortcuts import render

# Create your views here.

#  去数据库数据
data = []
for i in range(1,302):
    tmp = {"id":i,"name":"lishi-{}".format(i)}
    data.append(tmp)


def user_list(request):
    #  异常处理: 防止传的page不正常如字母
    try:
        page_num = int(request.GET.get("page"))  # http://127.0.0.1:8000/user_list/page=4
        # 页面传输都是字符串,而下面需要该值来计算,所以要转成int
    except Exception as e:
        page_num = 1

    # 没有传页码,默认展示第一页(上面的异常处理能解决)
    # if not page_num:
    #     page_num = 1

    # 每页显示10条数据
    per_page_num = 10

    # user_list = data[0:10]  # 第一页   (1-1) *10   1*10
    # user_list = data[10:20] # 第二页   (2-1) *10   2*10
    # user_list = data[20:30]  # 第三页  (n-1) *10    n*10

    # 总数据个数(要显示的数据)
    total_count = len(data)

    # 总共有多少页    total_page_num 为总页数  当有more余数就得多加1页
    total_page_num,more = divmod(total_count,per_page_num)

    if more:
        total_page_num += 1
    # 如果你输入的页码数超过我的总页码,默认返回最后一页
    if page_num > total_page_num:
        page_num = total_page_num



    # 去数据库取数据
    start = (page_num-1) * per_page_num
    end = page_num * per_page_num
    user_list = data[start:end]

    # 最多显示多少页码(在页面的分页条,一般以奇数为主
    max_show = 11
    half_show = int((max_show-1)/2)
    # 页面上页码从哪开始
    page_start = page_num - half_show
    # 页面上页码展示到哪一个
    page_end = page_num + half_show


    # 如果当前页小于等于half_show,就默认从第一页展示到max_show
    if page_num <= half_show:
        page_start = 1
        page_end = max_show

    # 如果当前页大于等于总页数-half_show
    if page_num >= total_page_num - half_show:
        page_end = total_page_num
        page_start = total_page_num - max_show




    # 生成前端页码的HTML
    page_html_list = []

    # 放置一个首页按钮
    page_first_tmp = '<li><a href="/user_list/?page=1">首页</a></li>'
    page_html_list.append(page_first_tmp)

    # 加一个上一页按钮
    if page_num -1 <= 0: # 表示没有上一页
        # page_prev_tmp = '<li><a href="#">上一页</a></li>'
        page_prev_tmp = '<li class="disable"><a href="#">上一页</a></li>'

    else:
        page_prev_tmp = '<li><a href="/user_list/?page={}">上一页</a></li>'.format(page_num-1)
    page_html_list.append(page_prev_tmp)

    for i in range(page_start,page_end+1):
        # 如果是当前页,就加一个active样式
        if i == page_num:
            tmp = ' <li class="active"><a href="/user_list/?page={0}">{0}</a></li>'.format(i)
        else:
            tmp =' <li><a href="/user_list/?page={0}">{0}</a></li>'.format(i)
        page_html_list.append(tmp)


    # 添加一个下一页按钮
    if page_num+1 > total_page_num:
        page_next_tmp = '<li class="disable"><a href="#">下一页</a></li>'
    else:
        page_next_tmp = '<li><a href="/user_list/?page={}">下一页</a></li>'.format(page_num + 1)
    page_html_list.append(page_next_tmp)

    # 添加一个尾页按钮
    page_last_tmp = '<li><a href="/user_list/?page={}">尾页</a></li>'.format(total_page_num)
    page_html_list.append(page_last_tmp)

    page_html = "".join(page_html_list)
    # 把上面这些tmp拼接成一个大的字符串

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

搞成类进行调用

views

from django.shortcuts import render

# Create your views here.

#  去数据库数据
data = []
for i in range(1,302):
    tmp = {"id":i,"name":"lishi-{}".format(i)}
    data.append(tmp)





def user_list(request):
    page_num = request.GET.get("page")
    path = request.path_info  # 取得请求的url不带参数的
    # request.get_full_path()   # 带参数的URl

    from tools.mypage import MyPage
    page = MyPage(page_num,len(data),path)


    page_html = page.page_html()


    # return render(request,"user_list.html",{"user_list":data[page.start():page.end()]})
    return render(request,"user_list.html",{"user_list":data[page.start:page.end],"page_html":page_html})
Views

创个tools

class MyPage(object):

    def __init__(self,page_num,total_count,base_url,per_page_num=10,max_show=11):
        """

        :param page_num:   当前页
        :param total_count:     数据总个数
        :param base_url:     分页页码跳转的URL  (要实现动态传url
        :param per_page_num:    每一页显示多少条数据
        :param max_show:    页面上最多显示多少页码
        """
        # 实例化传进来的参数
        self.page_num = page_num
        try:
            self.page_num = int(page_num)  # 字符串类型,所以要装为int
        except Exception as e:
            self.page_num = 1

        self.total_count = total_count
        self.base_url = base_url
        self.per_page_num = per_page_num
        self.max_show = max_show
        # 根据传进来的参数,计算的几个值
        self.half_show = int((self.max_show - 1)/2)

        # 总共有多少页
        self.total_page_num,more = divmod(self.total_count,self.per_page_num)
        if more:
            self.total_page_num += 1


    # 函数中的一些计算
    #加这个装饰器 把一个方法变成属性调用的,方法调用需要加括号
    @property
    def start(self):
        return (self.page_num - 1) * self.per_page_num

    @property
    def end(self):
        return self.page_num * self.per_page_num


    def page_html(self):
        """
         返回页面上可以用的一段HTML
         一段可用的分页页码的html
        :return:
        """
        # 页面上的页码从哪开始
        page_start = self.page_num - self.half_show
        # 页面上的页码最多展示到哪个
        page_end = self.page_num + self.half_show


        # 如果当前页小于等于half_show,就默认从第一页展示到max_show
        if self.page_num <= self.half_show:
            page_start = 1
            page_end = self.max_show

        # 如果当前页大于等于总页数-half_show
        if self.page_num >= self.total_page_num - self.half_show:
            page_end = self.total_page_num
            page_start = self.total_page_num - self.max_show




        # 生成前端页码的HTML
        page_html_list = []

        # 放置一个首页按钮
        page_first_tmp = '<li><a href="{}?page=1">首页</a></li>'.format(self.base_url)
        page_html_list.append(page_first_tmp)

        # 加一个上一页按钮
        if self.page_num -1 <= 0: # 表示没有上一页
            # page_prev_tmp = '<li><a href="#">上一页</a></li>'
            page_prev_tmp = '<li class="disable"><a href="#">上一页</a></li>'

        else:
            page_prev_tmp = '<li><a href="{0}?page={1}">上一页</a></li>'.format(self.base_url,self.page_num-1)
        page_html_list.append(page_prev_tmp)

        for i in range(page_start,page_end+1):
            # 如果是当前页,就加一个active样式,生成的是分页条哪到哪
            if i == self.page_num:
                tmp = ' <li class="active"><a href="{0}?page={1}">{1}</a></li>'.format(self.base_url,i)
            else:
                tmp =' <li><a href="{0}?page={1}">{1}</a></li>'.format(self.base_url,i)
            page_html_list.append(tmp)


        # 添加一个下一页按钮
        if self.page_num+1 > self.total_page_num:
            page_next_tmp = '<li class="disable"><a href="#">下一页</a></li>'
        else:
            page_next_tmp = '<li><a href="{0}?page={1}">下一页</a></li>'.format(self.base_url,self.page_num+1)
        page_html_list.append(page_next_tmp)

        # 添加一个尾页按钮
        page_last_tmp = '<li><a href="{0}?page={1}">尾页</a></li>'.format(self.base_url,self.total_page_num)
        page_html_list.append(page_last_tmp)

        return "".join(page_html_list)
        # 把上面这些tmp拼接成一个大的字符串
mypage

原文地址:https://www.cnblogs.com/jassin-du/p/8353186.html