django项目中通用的分页组件

文章目录

分页组件

应用分页组件,需要以下两个步骤:

  1. 视图函数中:(先获取queryset,将request和queryset传入分页组件对象中,得到生成的html标签)

    python 复制代码
    def customer_list(request):
        # 所有数据
        queryset = models.Customer.objects.filter(active=1).select_related('level')
    
        pager = Pagination(request, queryset)
        context = {
            "queryset": queryset[pager.start:pager.end],
            "pager_string": obj.html()
        }
        return render(request, 'customer_list.html', context)
  2. 在页面上:(直接引用即可)

    html 复制代码
    {% for row in queryset %}
        {{row.id}}
    {% endfor %}
    
    <ul class="pagination">
        {{ pager_string }}
    </ul>

pager组件代码

python 复制代码
import copy
from django.utils.safestring import mark_safe


class Pagination(object):
    """ 分页 """

    def __init__(self, request, query_set, per_page_count=10):
        """
        :param request: 需要用request对象中的GET中的数据进行校验和处理
        :param query_set: 查询数据库得到的查询集
        :param per_page_count: 每页显示几条数据
        """
        # 防止分页操作对后续的使用request.GET有影响
        self.query_dict = copy.deepcopy(request.GET)

        # 将self.query_dict._mutable设置为True:表示query_dict可修改,默认为False
        self.query_dict._mutable = True

        # 拿到总数据据数
        self.query_set = query_set
        total_count = query_set.count()
        self.total_count = total_count

        # 计算出总共有多少页面
        self.total_page, div = divmod(total_count, per_page_count)
        if div:
            self.total_page += 1

        # 对url中的请求参数进行校验处理,决定显示那一页
        page = request.GET.get('page')
        if not page:
            page = 1
        else:
            if not page.isdecimal():
                page = 1
            else:
                page = int(page)
                if page <= 0:
                    page = 1
                else:
                    if page > self.total_page:
                        page = self.total_page
        self.page = page

        # 每页数据条数
        self.per_page_count = per_page_count

        # 页面第一条数据
        self.start = (page - 1) * per_page_count
        # 页面最后一条数据
        self.end = page * per_page_count

    def html(self):
        """
        :return: 生成的当前页面的分页栏html
        """
        pager_list = []
        if not self.total_page:
            return ""

        # 求出生成的分页栏html显示的页面范围
        if self.total_page <= 11:
            # 总页码小于11
            start_page = 1
            end_page = self.total_page
        else:
            # 总页码比较多
            # 判断当前页 <=6: 1~11
            if self.page <= 6:
                start_page = 1
                end_page = 11
            else:
                if (self.page + 5) > self.total_page:
                    # 显示最后10页
                    start_page = self.total_page - 10
                    end_page = self.total_page
                else:
                    # 显示前后5页
                    start_page = self.page - 5
                    end_page = self.page + 5

        # 添加url中的参数,而不是替换:?&age=19&name=123&page=1
        # 首页
        self.query_dict.setlist('page', [1])
        pager_list.append('<li><a href="?{}">首页</a></li>'.format(self.query_dict.urlencode()))

        # 上一页
        if self.page > 1:
            self.query_dict.setlist('page', [self.page - 1])
            pager_list.append('<li><a href="?{}">上一页</a></li>'.format(self.query_dict.urlencode()))

        # 当前页+前后5页
        for i in range(start_page, end_page + 1):
            self.query_dict.setlist('page', [i])
            if i == self.page:
                item = '<li class="active"><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)
            else:
                item = '<li><a href="?{}">{}</a></li>'.format(self.query_dict.urlencode(), i)
            pager_list.append(item)

        # 下一页
        if self.page < self.total_page:
            self.query_dict.setlist('page', [self.page + 1])
            pager_list.append('<li><a href="?{}">下一页</a></li>'.format(self.query_dict.urlencode()))

        # 尾页
        self.query_dict.setlist('page', [self.total_page])
        pager_list.append('<li><a href="?{}">尾页</a></li>'.format(self.query_dict.urlencode()))

        pager_list.append('<li class="disabled"><a>数据{}条{}页</a></li>'.format(self.total_count, self.total_page))
        pager_string = mark_safe("".join(pager_list))
        return pager_string


  def queryset(self):
      """
      :return: 生成的当前页面的展示数据
      """
      if self.total_count:
          return self.query_set[self.start:self.end]
      return self.query_set

可能用到django框架中QueryDict知识点,可以看看Django框架中的:QueryDict(处理url参数)
若有错误与不足请指出,关注DPT一起进步吧!!!

相关推荐
第九序言T10 分钟前
数据分析岗 Pandas 面试题 20 道(上):概念与读代码
python·数据分析·pandas·数据处理
Dmz丶11 分钟前
前端转 AI 100 天 Day 37:Few-shot 与 CoT——让模型学会“推理”
python
孟健32 分钟前
我用Grok Bot本地剪口播视频,3段提示词搞定气口切除、字幕与封面
人工智能·python·aigc
2601_966949651 小时前
如何封装 qd.klines.batch(),让批量 K 线查询函数在多个策略中复用?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
神仙别闹2 小时前
基于Python实现英词语自动对齐系统
开发语言·python
老歌老听老掉牙3 小时前
圆柱端面四平面交线及其在yoz面投影的几何解析与 Python 实现
开发语言·python·平面
我要见SA姐13 小时前
Chrome 扩展安全攻防实录:从权限滥用到供应链投毒
运维·人工智能·python·机器学习·自动化
2601_962885723 小时前
给 backtrader 接 A 股数据:用 AlphaFeed 喂PandasData
python
YYYing.4 小时前
【Agent系列 (十一) 】上下文工程
人工智能·python·ai·agent·上下文工程
计算机毕业编程指导师4 小时前
基于深度学习的光伏组件红外图像缺陷识别系统设计与实现
人工智能·python·深度学习·目标检测·毕业设计·课程设计·光伏