首页 > 其他分享 >Django原生分页功能的实现

Django原生分页功能的实现

时间:2023-08-11 15:36:37浏览次数:36  
标签:原生 count 分页 self Django dict query total page

分页类的封装

"""
如果想要以后使用分页,需要以下两个步骤:
在视图函数:
def customer_list(request):
    # 这里是获取搜索form表单提交的搜索关键字
    keyword = request.GET.get('keyword','').strip()
    # 使用Q对象进行或查询
    con = Q()
    if keyword:
        con.connector = 'OR'
        con.children.append(('username__contains', keyword))
        con.children.append(('mobile__contains', keyword))
        con.children.append(('level__title__contains', keyword))
    # 查询数据库,多了一个>filter是进行搜索查询
    queryset = models.Customer.objects.filter(con).filter(active=1).select_related('level')
    # 分页数据展示,引入这个定义好的类就行,传入request和查询出来的queryset
    pager = Pagination(request, queryset)
    # 返回给前端页面的数据,直接locals()即可
    return render(request,'customer_list.html',locals())

在页面上:
    展示数据
    {% for row in pager.queryset %}
        {{row.id}}
    {% endfor %}

    在数据下面添加分页,这个样式pagination是借用的bootstrap3的css样式
    <ul class="pagination">
        {{ pager.html }}
    </ul>
"""
import copy
from django.utils.safestring import mark_safe


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

    def __init__(self, request, query_set, per_page_count=10):

        self.query_dict = copy.deepcopy(request.GET)
        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

        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):
        pager_list = []
        if not self.total_page:
            return ""

        # 总页码小于11
        if self.total_page <= 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:
                    start_page = self.total_page - 10
                    end_page = self.total_page
                else:
                    start_page = self.page - 5
                    end_page = self.page + 5

        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()))

        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):
        if self.total_count:
            return self.query_set[self.start:self.end]
        return self.query_set

标签:原生,count,分页,self,Django,dict,query,total,page
From: https://www.cnblogs.com/suncolor/p/17535368.html

相关文章

  • 关于django中如何让页面跳转时携带当前页面的参数
    需求分析:处理逻辑步骤:在跳转到目标url时,先要获取当前页url所携带的参数#当前页urlhttp://127.0.0.1:9000/customer/list/?page=11#获取当前页url所携带的参数request.GET.urlencode()#paeg=11构造跳转页面的url#原本跳转页链接http://127.0.0.1:9000/custo......
  • django中如何开启事务&启动锁
    django开启事务#先导入模块fromdjango.dbimporttransaction#开启事务try: withtransaction.atomic(): 操作数据库的代码块 (出现异常会回滚)exceptExceptionase: 出现异常会执行下面的代码django开启锁......
  • 【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(高级
    推荐超值课程:点击获取对于Httpclient请求机制进行设置操作处理。@Body注解申明一个请求体模板,模板中可以带有参数,与方法中@Param注解申明的参数相匹配,使用方法如下:interfaceLoginClient{voidlogin(Stringuser,Stringpassword);}...client.login("denominato......
  • 探索未知,即刻搭建AI原生应用!WAVE SUMMIT Workshop等你来参加
    你是否希望掌握大模型开发的秘诀?你是否渴望得到实践操作的机会?如果你的心中充满热情和期待,那么,WAVESUMMIT2023特别设置的Workshop将会是你的知识启航站!本次Workshop专注于AI开发与大模型应用,邀请一线优秀的AI软件工程师和产品专家,分享他们的技术心得,带领每一位参与者深入了解AI的......
  • Django 标签未注册解决办法 Invalid block tag on line 9: 'ifequal'. Did you forget
     这是一个常见问题,但不要担心!一旦您了解了导致模板标记错误的原因,无论是拼写错误、语法还是忘记加载库,就可以轻松修复它。Django中的标签是什么?Django中的标签为Django模板添加了特殊功能,允许您在模板中执行操作。例如,使用标签,您可以以特定格式显示数据、循环访问上下文......
  • 如何使用原生 JavaScript Canvas API 实现视频中的绿幕背景替换功能 All In One
    如何使用原生JavaScriptCanvasAPI实现视频中的绿幕背景替换功能AllInOneCanvas&Videodemoschroma-keying/greenscreeneffectconstprocessor={};processor.doLoad=functiondoLoad(){constvideo=document.getElementById("video");this.vid......
  • 15云原生架构
    云原生也是云,它基于分布式部署和统一运管的分布式云,以容器、微服务、DevOps等技术为基础建立的一套技术产品体系。云原生就是从云里产生的产品所构成的云原生态的体系。而不是云之外的产品或者脱离云的产品。 云原生架构设计原则服务化原则:以微服务为技术弹性原则:对相关的......
  • Python基础day63Django操作session和中间件使用
    Django操作cookie#设置cookie#获取cookieset_cookie('key','value',max_age=5,expires=5)参数:●key,键●value=’’,值●max_age=None,超时时间cookie需要延续的时间(以秒为单位)如果参数是\None``,这个cookie会延续到浏览器关闭为止expires=None,超时时间(......
  • Springboot 3.x 使用PageHelper实现MyBatis分页查询
    开发环境SpringBoot3.0.1Maven工程JDKOpenJdk17.0.6引入pom依赖<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.7</version></depende......
  • 什么是迭代器,生成器,装饰器;django的信号用过吗?如何用,干过什么;什么是深拷贝,什么是浅拷贝
    什么是迭代器,生成器,装饰器;django的信号用过吗?如何用,干过什么;什么是深拷贝,什么是浅拷贝,如何使用什么是迭代器,生成器,装饰器#迭代器-迭代:一种不依赖于索引取值的方式,我们不需要关注它的位置,只要能够一个个取值,它就称之为迭代,python中就是for循环,内部调用对象.__next__()-可迭......