项目组件:分页(pagination)

此分页组件可以辅助完成项目中前端页面分页展示
"""
分页组件应用:
1. 在视图函数中
    queryset = models.Issues.objects.filter(project_id=project_id)
    page_object = Pagination(
        current_page=request.GET.get(‘page‘),
        all_count=queryset.count(),
        base_url=request.path_info,
        query_params=request.GET
    )
    issues_object_list = queryset[page_object.start:page_object.end]

    context = {
        ‘issues_object_list‘: issues_object_list,
        ‘page_html‘: page_object.page_html()
    }
    return render(request, ‘issues.html‘, context)
2. 前端
    {% for item in issues_object_list %}
        {{item.xxx}}
    {% endfor %}

     <nav aria-label="...">
        <ul class="pagination" style="margin-top: 0;">
            {{ page_html|safe }}
        </ul>
    </nav>
"""

class Pagination(object):
    def __init__(self, current_page, all_count, base_url, query_params, per_page=30, 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:
                self.current_page = 1
        except Exception as e:
            self.current_page = 1
        query_params = query_params.copy()
        query_params._mutable = True
        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:
        """
        if self.all_count == 0:
            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)

        if self.all_count:
            tpl = "<li class=‘disabled‘><a>共%s条数据,页码%s/%s页</a></li>" % (
            self.all_count, self.current_page, self.pager_count,)
            page_list.append(tpl)
        page_str = "".join(page_list)
        return page_str

原文地址:https://www.cnblogs.com/fengting0913/p/12687077.html

时间: 2024-11-09 06:19:22

项目组件:分页(pagination)的相关文章

分页Pagination

分页Pagination REST framework提供了分页的支持. 我们可以在配置文件中设置全局的分页方式,如: REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 100 # 每页数目 } 也可通过自定义Pagination类,来为视图添加不同分页行为.在视图中通过pagination_clas属性来指明. from re

在Visual Studio中使用组件图描述项目组件依赖关系

如果想描述项目组件的关系,可以考虑使用UML组建图. 在建模项目下添加一个名称为"Applicaiton Component Structure"的UML组建图. 添加各个组件,并添加依赖关系. 在必要的时候,给组件添加备注. 如果想给依赖关系备注,需要在Name属性中设置. 可以为组件添加接口. 备注: ● 明确项目中的可执行程序和组件● 明确各个组件的依赖关系● 必要的时候明确组件的实现接口 参考资料:https://channel9.msdn.com/Blogs/clinted

五:Vue之ElementUI 表格Table与分页Pagination组件化

(注:本文适用于有一定Vue基础或开发经验的读者,文章就知识点的讲解不一定全面,但却是开发过程中很实用的) 在平时的web项目开发过程中,列表分页查询展示应用的很频繁,为了便于阅读并减少代码的冗余,所以对ElementUI的表格和分页组件进行了二次封装. 首先在工程下的components目录下创建common文件夹并新建commonTable.vue文件,添加如下代码: <template> <div id="commonTable"> <el-tabl

关于分页Pagination的使用

在这个例子当中,用的是ssm框架整合,并且用的是Pagination实现分页 先来看一下分页中用到的类的源码 Paginable.java 1 package cn.itcast.common.page; 2 3 /** 4 * 分页接口 5 */ 6 public interface Paginable { 7 /** 8 * 总记录数 9 * 10 * @return 11 */ 12 public int getTotalCount(); 13 14 /** 15 * 总页数 16 * 1

Django框架-CRM项目之分页实现

自定义分页 分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应在数据库表中的起始位置. 1.设定煤业显示的数据条数 2.用户输入页码(第一页,第二页...) 3.根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置 4.在数据表中根据起始位置取值,页面上输出数据 前面那样会在页面中生成所有的页码,但实际需要是设定指定数量的页码,格式如 [上一页][1][2][3][4][5][下一页] 1.设定每页显示数据条数 2.用户输入页码 3.设定显示多少页号 4.获取当

ElementUI分页Pagination自动到第一页

当数据量过多时,使用分页请求数据. 设置分页的页数自动回到第一页. 例: <div class="pagination"> <el-pagination background layout="prev, pager, next" :current-page.sync="currentPage" @current-change="current_change" :page-size="7"

DRF ---- 过滤组件 分页组件 过滤组件插件使用

目录 DRF过滤组件 1 源码分析: 2 全局配置 过滤 类们 3 局部配置 过滤 类们 4 系统提供 过滤 类们 OrderingFilter(排序过滤) SearchFilter(查询过滤) 联合使用 DRF分页组件 1 全局配置 2 局部配置 3 PageNumberPagination基础分页 4 LimitOffsetPagination偏移分页 5 CursorPagination游标分页 加密分页(了解) 6.自定义过滤器 7 django-filter 过滤插件(重点) 安装 自

django 分页 pagination的使用记录

1.安装 pip install django-pagination 2.修改setting.py文件 INSTALLED_APPS = [ # ** 'pagination',] MIDDLEWARE_CLASSES = ( # ... 'pagination.middleware.PaginationMiddleware', ) TEMPLATE_CONTEXT_PROCESSORS = [ 'django.contrib.auth.context_processors.auth', 'dj

web项目的分页

在web项目中,分页应用最普遍,简单记录一下我在实际项目中使用的分页思路: 1.RowBounds分页,这种分页不推荐使用,RowBounds在处理分页时,只是简单的把offset之前的数据都skip掉,超过limit之后的数据不取出,简单点说,就是先把数据全部查询到ResultSet,然后从ResultSet中取出offset和limit之间的数据,这 就实现了分页查询.Mysql中可以使用limit语句,但limit并不是标准SQL中的,如果是其它的数据库,则需要使用其它语句. 2.一般项目