You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django 2列表分页实现求助,仅找到Django 1.3旧版文档

Django 2+ 列表分页实现方案

嘿,我来帮你搞定Django 2+的分页功能!其实Django自带的分页工具就非常好用,完全不用纠结旧文档~下面一步步来实现:

第一步:修改 views.py

首先导入Django的分页工具,然后在视图里添加分页逻辑:

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render
from .models import Item  # 确保你导入了Item模型

def home(request):
    # 简化QuerySet写法:filter已经返回QuerySet,无需额外调用all()
    all_dress = Item.objects.filter(dress_active=True)
    all_good_dress = Item.objects.filter(dress_special=True)
    current_user = request.user

    # 分页核心逻辑
    paginator = Paginator(all_dress, 6)  # 每页显示6条数据,可根据需求修改
    page_number = request.GET.get('page')  # 获取URL中的page参数

    try:
        dress_page = paginator.page(page_number)
    except PageNotAnInteger:
        # 如果页码不是整数,默认展示第一页
        dress_page = paginator.page(1)
    except EmptyPage:
        # 如果页码超出有效范围,展示最后一页
        dress_page = paginator.page(paginator.num_pages)

    context = {
        'dress_page': dress_page,  # 将分页后的对象传入模板
        'current_user': current_user,
        'all_good_dress': all_good_dress,
    }
    return render(request, 'fostania/home.html', context)

第二步:修改模板(home.html)

首先把原来遍历all_dress的代码改成遍历分页对象dress_page,然后在循环结束后添加分页导航栏:

<!-- 遍历分页后的商品列表 -->
{% for item in dress_page %}
<div class="card border-info" style="width: 18rem;">
    <a href="{% url 'dress_details' item.pk%}"><img class="card-img-top" src="{{ item.dress_image1.url }}" alt="Card image cap"></a>
    <div class="card-body" align="right">
        <h5 class="card-title"><a href="{% url 'dress_details' item.pk%}">{{ item.dress_name }}</a>
        <br>{{ item.dress_action }}<br>{{ item.dress_price }} 噩賳賷賴 </h5>
        <p class="card-text">丕賱賲賯丕爻 : {{ item.dress_size }} <br>{{ item.dress_city }}<br> {{ item.created_at|date:"SHORT_DATE_FORMAT" }} </p>
    </div>
</div>
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{% endfor %}

<!-- 分页导航栏 -->
<div class="mt-4 d-flex justify-content-center">
    <nav aria-label="Page navigation example">
        <ul class="pagination">
            <!-- 首页按钮 -->
            {% if dress_page.has_previous %}
            <li class="page-item">
                <a class="page-link" href="?page=1" aria-label="First">
                    <span aria-hidden="true">&laquo; 首页</span>
                </a>
            </li>
            <!-- 上一页按钮 -->
            <li class="page-item">
                <a class="page-link" href="?page={{ dress_page.previous_page_number }}" aria-label="Previous">
                    <span aria-hidden="true">上一页</span>
                </a>
            </li>
            {% endif %}

            <!-- 当前页码信息 -->
            <li class="page-item disabled">
                <span class="page-link">
                    第 {{ dress_page.number }} 页 / 共 {{ dress_page.paginator.num_pages }} 页
                </span>
            </li>

            <!-- 下一页按钮 -->
            {% if dress_page.has_next %}
            <li class="page-item">
                <a class="page-link" href="?page={{ dress_page.next_page_number }}" aria-label="Next">
                    <span aria-hidden="true">下一页</span>
                </a>
            </li>
            <!-- 末页按钮 -->
            <li class="page-item">
                <a class="page-link" href="?page={{ dress_page.paginator.num_pages }}" aria-label="Last">
                    <span aria-hidden="true">末页 &raquo;</span>
                </a>
            </li>
            {% endif %}
        </ul>
    </nav>
</div>

关键说明:

  • dress_page是Django的Page对象,它本身是可迭代的,所以可以直接用{% for %}遍历
  • 常用的Page对象属性:
    • has_previous:是否有上一页
    • has_next:是否有下一页
    • number:当前页码
    • paginator.num_pages:总页数
  • 你可以根据自己的UI需求调整分页导航的样式,上面的示例用了Bootstrap的分页组件,如果你没用Bootstrap,也可以改成纯CSS样式。

内容的提问来源于stack exchange,提问作者Ahmed Wagdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:30:53