django 分页

Django自带分页:

 导入:    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

含有两个对象可以互相调用:page对象  paginator 对象

对象方法不相同  

paginator 对象方法:

                par_page:           每页显示条目数量
                cout:                  数据总个数
                num_pages:      总页数
                page_range:   总页数的索引范围(1,100)

                page:              page对象

page对象方法:

         has_next                   是否有下一页
         next_page_number  下一页页码
         has_previous            是否有上一页
         object_list                 分页之后的数据列表
         number                    当number前页
         paginator                 paginator对象


自定显示页码


————————————————————————————————————————————————————


class CustomPaginator(Paginator):
    def __init__(self,current_page, per_pager_num,*args,**kwargs):
        # 当前页
        self.current_page = int(current_page)
        # 最多显示的页码数量 11
        self.per_pager_num = int(per_pager_num)
        super(CustomPaginator,self).__init__(*args,**kwargs)
    def pager_num_range(self):
        # 当前页
        #self.current_page
        # 最多显示的页码数量 11
        #self.per_pager_num
        # 总页数
        # self.num_pages
        if self.num_pages < self.per_pager_num:
            return range(1,self.num_pages+1)
        # 总页数特别多 5
        part = int(self.per_pager_num/2)
        if self.current_page <= part:
            return range(1,self.per_pager_num+1)
        if (self.current_page + part) > self.num_pages:
            return range(self.num_pages-self.per_pager_num+1,self.num_pages+1)
        return range(self.current_page-part,self.current_page+part+1)

def index1(request):
    current_page = request.GET.get('p')
    # Paginator对象
    paginator = CustomPaginator(current_page,7,USER_LIST, 10)
    try:
        posts = paginator.page(current_page)
    except PageNotAnInteger:
        posts = paginator.page(1)
    except EmptyPage:
        posts = paginator.page(paginator.num_pages)

    return render(request,'index1.html',{'posts':posts})

原版分页parger.html
 
{% if posts.has_previous %}
    <a href="index1?p={{ posts.previous_page_number }}">上一页</a>
{% endif  %}
{% if posts.has_next %}
<a href="index1?p={{ posts.next_page_number}}">下一页</a>
{% endif %}

{% for i in posts.paginator.pager_num_range %}
    {% if i == posts.number %}
        <a href="index1?p={{ i }}" style="font-size: 30px"> {{ i }}</a>
        {% else %}
        <a href="index1?p={{ i }}">{{ i }}</a>
    {% endif %}
{% endfor %}

<span> {{ posts.number }}</span>
<span>/ {{ posts.paginator.num_pages }}</span>
HTML文件

{% for row in posts%}
    <li>
        {{ row.name }}
        {{ row.age }}
    </li>
{% endfor %}
</ul>

{% include 'include/parger.html' %}


自定制分页显示

pager.py
# -*- coding:utf-8 -*-

class Pagination(object):
    def __init__(self, totalCount, currentPage,perPageItemNum=10, maxPageNum=7):
        # 数据总个数
        self.total_count = totalCount
        # 当前页
        try:
            v = int(currentPage)
            if v <= 0:
                v = 1
            self.current_page = v
        except Exception as e:
            self.current_page = 1

        # 每页显示的行数
        self.per_page_item = perPageItemNum
        # 每页最多显示页码数
        self.max_page_num = maxPageNum

    def start(self):
        return (self.current_page-1) * self.per_page_item

    def end(self):
        return self.current_page * self.per_page_item

    @property
    def num_pages(self):
        # 判断极值
        # 总页数199 每页显示
        a,b = divmod(self.total_count,self.per_page_item)
        if b == 0:
            return a
        return a+1

    # 要显示的页码
    def pager_num_range(self):
        # 当前页
        # self.current_page
        # 最多显示的页码数量 11
        # self.per_pager_num
        # 总页数
        # self.num_pages
        if self.num_pages < self.max_page_num:
            return range(1, self.num_pages + 1)
        # 总页数特别多 5
        part = int(self.max_page_num / 2)
        if self.current_page <= part:
            return range(1, self.max_page_num + 1)
        if (self.current_page + part) > self.num_pages:
            return range(self.num_pages - self.max_page_num + 1, self.num_pages + 1)
        return range(self.current_page - part, self.current_page + part + 1)

    # 返回前端页面的字符串
    def page_str(self):
        page_list = []

        first="<li><a href='/index2.html?p=1'>首页</a></li>"
        page_list.append(first)

        if self.current_page == 1:
            prev = "<li><a href='#'>上一页</a></li>"
        else:
            prev = "<li><a href='/index2.html?p=%s'>上一页</a></li>" % (self.current_page - 1,)
        page_list.append(prev)

        for i in self.pager_num_range():
            if i == self.current_page:
                temp = "<li class='active'><a href='/index2.html?p=%s'>%s</a></li>" % (i, i)
            else:
                temp = "<li><a href='/index2.html?p=%s'>%s</a></li>" % (i, i)
            page_list.append(temp)

        if self.current_page == self.num_pages:
            nex = "<li><a href='#'>下一页</a></li>"
        else:
            nex = "<li><a href='/index2.html?p=%s'>下一页</a></li>" % (self.current_page + 1,)
            page_list.append(nex)

        last = "<li><a href='/index2.html?p=%s'>尾页</a></li>" % (self.num_pages,)
        page_list.append(last)

        return "".join(page_list)

views.py

def index2(request):
    # 导入自定义py文件
    from app01.pager import Pagination
    # 获取当前页
    current_page = request.GET.get('p')
    # 创建对象传入值 199总数
    page_obj = Pagination(199,current_page)
    # 切片传入值
    data_list = USER_LIST[page_obj.start():page_obj.end()]

    return render(request,'index2.html',{"data":data_list,'page_obj':page_obj})
html 文件
{% for row in data%}
    <li>
        {{ row.name }}
        {{ row.age }}
    </li>
{% endfor %}
</ul>
    {% for i in page_obj.pager_num_range %}
        <a href="/index2.html?p={{ i }}">{{ i }}</a>
    {% endfor %}
        <ul class="pagination pagination-sm">
                {{ page_obj.page_str|safe }}
        </ul>



### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值