zoukankan      html  css  js  c++  java
  • 自定义分页

    自定义分页

    准备知识点:

      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

  • 相关阅读:
    android中正确保存view的状态
    使用AudioTrack播放PCM音频数据(android)
    【录音】Android录音--AudioRecord、MediaRecorder
    (原创)初识cordova(一)
    忽略git中不需要进行版本管理的文件
    GitHub 小试
    通过View.post()获取View的宽高
    org.json.JSONObject的getString和optString使用注意事项
    android---EditText的多行输入框
    【转】我赌5毛你没见过这样的SpannableString
  • 原文地址:https://www.cnblogs.com/jassin-du/p/8353186.html
Copyright © 2011-2022 走看看