• day96-django-分页模块(自定义)


    1.views.py
    from app01 import pager
    def custom(request): #当前页码: current_page = request.GET.get('page') # 数据库总行数 all_count = models.UserInfo2.objects.all().count() #实例化对象,参数:当前页码,数据库总行数,每页显示10行,url,每页显示11个页码 page_info = pager.Pager(current_page,all_count,10,'/custom.html',11) #每页显示的用户列表 user_list = models.UserInfo2.objects.all()[page_info.start():page_info.end()] #获取 上一页 页码 下一页 的字符串类型的所有li a标签 page_str = page_info.pager() return render(request, 'custom.html', {'user_list':user_list, 'page_str':page_str})
    2.custom.html
    
    <body>
        <h1>用户列表</h1>
        <ul>
            {% for row in user_list %}
                <li>{{ row.name }}</li>
            {% endfor %}
        </ul>
    
        <!--boorstrap分页-->
        <!--上 开始-->
        <nav aria-label="Page navigation">
          <ul class="pagination">
        <!--上 结束-->
              <!--|safe是告诉浏览器是安全的,否则浏览器会认为是xss攻击,无法显示正确样式-->
              {{ page_str|safe}}
        <!--下 开始-->
          </ul>
        </nav>
        <!--下 结束-->
    
    </body>
    3.urls.py
    
    from app01 import views
    urlpatterns = [
        url('custom.html', views.custom),
    ]
    4.自定义的pager模块,里面有Pager类
    class Pager(object):
        def __init__(self, current_page, all_count, per_page, base_url, show_page):
            """
            current_page:当前页码
            all_count: 数据库总行数
            per_page: 每页显示多少条数据,或者说多少行
            base_url:用户输入的url
            show_page:每页总共显示多少个页码
            """
            # 尝试执行,判断当前页码是不是字符串类型的数字,如果是,就强转为数字类型,
            # 然后增加属性
            try:
                self.current_page = int(current_page)
            # 如果不是,有可能是字符串,当前页码就直接跳转到第一页
            except Exception as e:
                self.current_page = 1
    
            self.per_page = per_page
    
            # divmod是取余,divmod(101,10)结果是10和1,10是页码数,10+1是总页码数
            a, b = divmod(all_count, per_page)
            # 如果b大于0,意味着不是整除,总页码数=页码数+1
            if b:
                a = a + 1
            # 总页码数属性
            self.all_pager = a
            # 每页总共显示多少个页码
            self.show_page = show_page
    
            self.base_url = base_url
    
        # 第几条开始
        def start(self):
            return (self.current_page - 1) * self.per_page
    
        # 第几条结束
        def end(self):
            return self.current_page * self.per_page
    
        # 假设per_page=10
        # 页码     每页显示开始和结束(不包结束的那条)
        # 1          0-10
        # 2          10-20
        # 3          20-30
    
        #获取 首页 上一页 页码 下一页 尾页的标签
        def pager(self):
            # v = "<a href='/custom.html?page=1'>1</a><a href='/custom.html?page=2'>2</a>"
            # return v
    
            # 页码列表
            page_list = []
    
            ######################## 页码判断 ############################
            # 每页显示的页码数11的一半,方便后面取到当前页码的前5页和后5页
            half = int((self.show_page - 1) / 2)
    
            # 如果总页码数 < 每页显示的页码数11
            if self.all_pager < self.show_page:
                begin = 1
                stop = self.all_pager + 1  # +1是因为range要头不要尾
            # 如果总页码数 >= 每页显示的页码数11
            else:
                # 如果当前页码 <=5,为了防止出现负数的页码,这里永远显示1,11
                if self.current_page <= half:
                    begin = 1
                    stop = self.show_page + 1
                # 如果当前页码 > 5:
                else:
                    # 如果当前页码+5 > 总页码数,为了防止超过总页码数
                    if self.current_page + half > self.all_pager:
                        begin = self.all_pager - self.show_page + 1
                        stop = self.all_pager + 1
                    # 如果当前页码+5 <= 总页码数
                    else:
                        begin = self.current_page - half
                        stop = self.current_page + half + 1
    
            ######################## 首页 ###############################
            first_page = "<li><a href='%s?page=1'>首页</a></li>" % (self.base_url)
            page_list.append(first_page)
    
            ######################## 上一页 ###############################
            # 如果当前页码<= 1,点上一页没跳转,因为href没设置url
            if self.current_page <= 1:
                prev = "<li><a href='#'>上一页</a></li>"
            # 如果当前页码> 1,href设置url和当前页码-1
            else:
                prev = "<li><a href='%s?page=%s'>上一页</a></li>" % (self.base_url, self.current_page - 1,)
            # 页码列表追加 上一页 的标签
            page_list.append(prev)
    
            ########################## 页码 #################################
            for i in range(begin, stop):
                #如果页码等于当前页码,这个标签就被选中,写上class='active',它是bootstrap分页的样式类
                if i == self.current_page:
                    temp = "<li class='active'><a  href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i,)
                else:
                    temp = "<li><a href='%s?page=%s'>%s</a></li>" % (self.base_url, i, i,)
                page_list.append(temp)
    
            ######################### 下一页 ################################
            # 如果当前页码 >= 总页码数,点下一页没跳转
            if self.current_page >= self.all_pager:
                nex = "<li><a href='#'>下一页</a></li>"
            # 如果当前页码 < 总页码数,href设置url和当前页码+1
            else:
                nex = "<li><a href='%s?page=%s'>下一页</a></li>" % (self.base_url, self.current_page + 1,)
            # 页码列表追加 下一页 的标签
            page_list.append(nex)
    
            ######################## 尾页 ###############################
            end_page = "<li><a href='%s?page=%s'>尾页</a></li>" % (self.base_url,self.all_pager)
            page_list.append(end_page)
    
            ######################## 返回字符串类型的所有标签 ######################################
            # ''.join['a','b','c','d',....]结果是'a,b,c,d...'
            return ''.join(page_list)
    
    
    
    

     

  • 相关阅读:
    CompletableFuture(yet)
    模拟future
    一次使用jmap评估是否可以把类似session信息挂靠在某未知框架的某暴露对象上
    只读事务与普通读
    多重分表分库一般解决方案
    mat解决oom一般方法实践
    类加载器隔离朴实案例(二)logback
    在51系列中data,idata,xdata,pdata的区别
    linux 简单的DMA例程
    disable_irq()与disable_irq_nosync()区别
  • 原文地址:https://www.cnblogs.com/python-daxiong/p/12738254.html
Copyright © 2020-2023  润新知