• stark组件开发之分页


    """
    分页组件
    """
    
    
    class Pagination(object):
        def __init__(self, current_page, all_count, base_url, query_params, per_page=20, pager_page_count=11):
            """
            分页初始化
            :param current_page: 当前页码
            :param per_page: 每页显示数据条数
            :param all_count: 数据库中总条数
            :param base_url: 基础URL
            :param query_params: QueryDict对象,内部含所有当前URL的原条件
            :param pager_page_count: 页面上最多显示的页码数量
            """
            self.base_url = base_url
            try:
                self.current_page = int(current_page)
                if self.current_page <= 0:
                    raise Exception()
            except Exception as e:
                self.current_page = 1
            self.query_params = query_params
            self.per_page = per_page
            self.all_count = all_count
            self.pager_page_count = pager_page_count
            pager_count, b = divmod(all_count, per_page)
            if b != 0:
                pager_count += 1
            self.pager_count = pager_count
    
            half_pager_page_count = int(pager_page_count / 2)
            self.half_pager_page_count = half_pager_page_count
    
        @property
        def start(self):
            """
            数据获取值起始索引
            :return:
            """
            return (self.current_page - 1) * self.per_page
    
        @property
        def end(self):
            """
            数据获取值结束索引
            :return:
            """
            return self.current_page * self.per_page
    
        def page_html(self):
            """
            生成HTML页码
            :return:
            """
            # 如果数据总页码pager_count<11 pager_page_count
            if self.pager_count < self.pager_page_count:
                pager_start = 1
                pager_end = self.pager_count
            else:
                # 数据页码已经超过11
                # 判断: 如果当前页 <= 5 half_pager_page_count
                if self.current_page <= self.half_pager_page_count:
                    pager_start = 1
                    pager_end = self.pager_page_count
                else:
                    # 如果: 当前页+5 > 总页码
                    if (self.current_page + self.half_pager_page_count) > self.pager_count:
                        pager_end = self.pager_count
                        pager_start = self.pager_count - self.pager_page_count + 1
                    else:
                        pager_start = self.current_page - self.half_pager_page_count
                        pager_end = self.current_page + self.half_pager_page_count
    
            page_list = []
    
            if self.current_page <= 1:
                prev = '<li><a href="#">上一页</a></li>'
            else:
                self.query_params['page'] = self.current_page - 1
                prev = '<li><a href="%s?%s">上一页</a></li>' % (self.base_url, self.query_params.urlencode())
            page_list.append(prev)
            for i in range(pager_start, pager_end + 1):
                self.query_params['page'] = i
                if self.current_page == i:
                    tpl = '<li class="active"><a href="%s?%s">%s</a></li>' % (
                        self.base_url, self.query_params.urlencode(), i,)
                else:
                    tpl = '<li><a href="%s?%s">%s</a></li>' % (self.base_url, self.query_params.urlencode(), i,)
                page_list.append(tpl)
    
            if self.current_page >= self.pager_count:
                nex = '<li><a href="#">下一页</a></li>'
            else:
                self.query_params['page'] = self.current_page + 1
                nex = '<li><a href="%s?%s">下一页</a></li>' % (self.base_url, self.query_params.urlencode(),)
            page_list.append(nex)
            page_str = "".join(page_list)
            return page_str

    视图:

     def check_list_view(self, request):
            '''
            列表查看页面
            :param request:
            :return:
            '''
            list_display = self.get_list_display()
            # 页面要显示的列 self.list_display  示例:['name', 'age', 'depart']
    
            # 1. 制作表头, 就是每张表中,每个字段写的 verbose_name.。 如何获取到这个值呢?
            # self.model_class._meta.get_field('name').verbose_name
            header_list = []  # 表头
            if list_display:
                for key_or_func in list_display:
                    if isinstance(key_or_func, FunctionType):  # 判断当前参数, 是一个字符串还是一个函数。
                        verbose_name = key_or_func(self, obj=None, is_header=True)
                    else:
                        verbose_name = self.model_class._meta.get_field(key_or_func).verbose_name
                    header_list.append(verbose_name)
            else:
                header_list.append(self.model_class._meta.model_name)
    
            # 2. 处理 从数据库 取到的数据   # 用户访问的表  self.model_class
    
            '''1.根据用户访问页面,计算出索引的位置, 比如 page=3
                2. 生成html页码
            '''
            all_count = self.model_class.objects.all().count()
            query_params = request.GET.copy()  # page=1&level=2
            query_params._mutable = True  # request.get中的值默认是不能被修改的。加上这句代码就可以修改了
    
            pager = Pagination(
                current_page=request.GET.get("page"),  # 用户访问的当前叶
                all_count=all_count,  # 数据库一共有多少数据
                base_url=request.path_info,  # 所在的url 就是 ?page=1 之前的URL
                # 用于保留,用户的请求信息,比如 level=2 被用户先选中。 那么分页后。因为查询的东西少了,分页也应该想要的减少,
                # 但是level=2这个, 请求的信息!不能因为。分页的原因。而减少。
                query_params=query_params,
                per_page=self.per_page,  # 每页显示多少数据。
            )
            data_list = self.model_class.objects.all()[pager.start:pager.end]
    
            body_list = []
            for row in data_list:
                row_list = []
                if list_display:
                    for key_or_func in list_display:
                        if isinstance(key_or_func, FunctionType):
                            # 这里is_header=False  obj=row(数据库中循环的每一行的对象)
                            row_list.append(key_or_func(self, obj=row, is_header=False))
                        else:
                            row_list.append(getattr(row, key_or_func))
                else:
                    row_list.append(row)
                body_list.append(row_list)
    
            return render(request, "stark/changelist.html",
                          {"header_list": header_list, "data_list": data_list,
                           "body_list": body_list,
                           "pager": pager})

    模板:

        <nav>
            <ul class="pagination">
                {{ pager.page_html|safe }}
            </ul>
        </nav>

    效果:

  • 相关阅读:
    (杭电 1014)Uniform Generator
    错排公式浅谈(推导+应用)
    (杭电 2045)不容易系列之(3)—— LELE的RPG难题
    (杭电 2046)骨牌铺方格
    (补题 杭电 2044)一只小蜜蜂...
    (杭电 1097)A hard puzzle
    Linux内核实验作业六
    《Linux内核设计与实现》第十八章读书笔记
    实验作业:使gdb跟踪分析一个系统调用内核函数
    k8s标签
  • 原文地址:https://www.cnblogs.com/chengege/p/10739046.html
Copyright © 2020-2023  润新知