zoukankan      html  css  js  c++  java
  • 分页插件

    分页的组件

    这是一个基于类的组件,使用只需要实例化对象即可

    参数:

    :param current_page: 当前页码
    :param all_count: 总数据条数
    :param per_num: 每页显示数据条数
    :param total_page: 总页码数
    :param max_show: 最多显示页码数
    :param page_start: 起始页码数
    :param page_end: 终止页码数
    :param start: 数据切片起始索引
    :param end: 数据切片终止索引

    代码:

    """
    分页组件
    """
    from django.utils.html import mark_safe
    
    
    class Pagination(object):
    
        def __init__(self, request, all_count, base_url, per_num=10, max_show=11):
            try:
                current_page = int(request.GET.get('page'))
                if current_page <= 0:
                    raise Exception()
            except Exception as e:
                current_page = 1
            self.base_url = base_url
            self.current_page = current_page
            self.max_show = max_show
            self.half_show = max_show // 2
            self.all_count = all_count
            self.per_num = per_num
            self.total_page, more = divmod(self.all_count, self.per_num)
            if more:
                self.total_page += 1
    
        @property
        def start(self):
            return (self.current_page - 1) * self.per_num
    
        @property
        def end(self):
            return self.current_page * self.per_num
    
        @property
        def html_str(self):
            # 计算起始页码数和终止页码数
            # 总页码数小于最大显示的页码数
            if self.total_page < self.max_show:
                page_start = 1
                page_end = self.total_page
            else:
                if self.current_page <= self.half_show:
                    # 总页码数大于最大显示页码数
                    page_start = 1
                    page_end = self.max_show
                elif self.current_page + self.half_show > self.total_page:
                    page_start = self.total_page - self.max_show + 1
                    page_end = self.total_page
                else:
                    page_start = self.current_page - self.half_show
                    page_end = self.current_page + self.half_show
            html_list = []
            if self.current_page <= 1:
                prev_li = '<li class="disabled"><a><上一页></a></li>'
            else:
                prev_li = '<li><a href="{0}?page={1}"><上一页></a></li>'.format(self.base_url, self.current_page - 1)
            html_list.append(prev_li)
            for i in range(page_start, page_end + 1):
                if i == self.current_page:
                    li_html = '<li class="active"><a href="{1}?page={0}">{0}</a></li>'.format(i, self.base_url)
                else:
                    li_html = '<li><a href="{1}?page={0}">{0}</a></li>'.format(i, self.base_url)
    
                html_list.append(li_html)
    
            if self.current_page >= self.total_page:
                next_li = '<li class="disabled"><a>< 下一页 ></a></li>'
            else:
                next_li = '<li><a href="{1}?page={0}">< 下一页 ></a></li>'.format(self.current_page + 1, self.base_url)
            html_list.append(next_li)
    
            return mark_safe("".join(html_list))

     带搜索的分页

    此分页组件解决的页面有搜索时候分页跳转全部的问题

    参数:

         :param current_page: 当前页码
    :param all_count: 总数据条数
    :param per_num: 每页显示数据条数
    :param total_page: 总页码数
    :param max_show: 最多显示页码数
    :param page_start: 起始页码数
    :param page_end: 终止页码数
    :param start: 数据切片起始索引
    :param end: 数据切片终止索引
    :param query_params: 搜索条件

    代码展示:

    class Pagination(object):
    
        def __init__(self, request, all_count, base_url, query_params, per_num=10, max_show=11):
            try:
                current_page = int(request.GET.get('page'))
                if current_page <= 0:
                    raise Exception()
            except Exception as e:
                current_page = 1
            self.base_url = base_url
            self.current_page = current_page
            self.query_params = query_params
            self.max_show = max_show
            self.half_show = max_show // 2
            self.all_count = all_count
            self.per_num = per_num
            self.total_page, more = divmod(self.all_count, self.per_num)
            if more:
                self.total_page += 1
    
        @property
        def start(self):
            return (self.current_page - 1) * self.per_num
    
        @property
        def end(self):
            return self.current_page * self.per_num
    
        @property
        def html_str(self):
            # 计算起始页码数和终止页码数
            # 总页码数小于最大显示的页码数
            if self.total_page < self.max_show:
                page_start = 1
                page_end = self.total_page
            else:
                if self.current_page <= self.half_show:
                    # 总页码数大于最大显示页码数
                    page_start = 1
                    page_end = self.max_show
                elif self.current_page + self.half_show > self.total_page:
                    page_start = self.total_page - self.max_show + 1
                    page_end = self.total_page
                else:
                    page_start = self.current_page - self.half_show
                    page_end = self.current_page + self.half_show
            html_list = []
            if self.current_page <= 1:
                prev_li = '<li class="disabled"><a><上一页></a></li>'
            else:
                self.query_params['page'] = self.current_page - 1
                prev_li = '<li><a href="{0}?{1}"><上一页></a></li>'.format(self.base_url, self.query_params.urlencode())
            html_list.append(prev_li)
            for i in range(page_start, page_end + 1):
                self.query_params['page'] = i
                if i == self.current_page:
                    li_html = '<li class="active"><a href="{0}?{1}">{2}</a></li>'.format(self.base_url,
                                                                                         self.query_params.urlencode(), i)
                else:
                    li_html = '<li><a href="{0}?{1}">{2}</a></li>'.format(self.base_url, self.query_params.urlencode(), i)
    
                html_list.append(li_html)
    
            if self.current_page >= self.total_page:
                next_li = '<li class="disabled"><a>< 下一页 ></a></li>'
            else:
                self.query_params['page'] = self.current_page + 1
                next_li = '<li><a href="{0}?{1}">< 下一页 ></a></li>'.format(self.base_url, self.query_params.urlencode())
            html_list.append(next_li)
    
            return mark_safe("".join(html_list))

    搜索字段:

    方便搜索栏的字段限制

        def get_search_conditon(self, request, fields_list):
            query = request.GET.get('query', '')
            print(query)
            q = Q()
            q.connector = 'OR'
            for i in fields_list:
                q.children.append(Q((f'{i}__contains', query)))
            return q

    使用方法:

    q = self.get_search_conditon(request, ['qq', 'qq_name']) 
    q是实力化限制字段的条件或条件,配合models查询条件使用
    customer_obj = models.Customer.objects.filter(q, consultant__isnull=True)

     query_params = copy.deepcopy(request.GET)
     query_params._mutable = True
    获取搜索的搜索的需要的条件路径  pagin_obj
    = Pagination(request, len(customer_obj), request.path_info, query_params)

    搜索的HTML:

     <form action="" class="form-inline " method="get" >
                        <div class="form-group ">
                            <input type="text" class="form-control" name="query">
    
                            <button class="btn btn-primary btn-sm">搜索 <i class="fa fa-search"></i></button>
                        </div>
                </form>
  • 相关阅读:
    兼容ie6的mvvm框架--san
    Parsing error: The keyword 'export' is reserved && error Parsing error: Unexpected token <
    Call to undefined function openssl_decrypt()
    css 陌生属性
    获取url
    relative 和 absolute
    SSL certificate problem: unable to get local issuer certificate 的解决方法
    使用wamp扩展php时出现服务未启动的解决方法
    php判断是不是移动设备
    js:不是空字符串的空字符串引起的bug
  • 原文地址:https://www.cnblogs.com/wy3713/p/9714075.html
Copyright © 2011-2022 走看看