8.分页器

本文详细介绍了如何在Django中使用Paginator处理分页,包括查询排序、异常处理以及分页显示优化。通过视图函数展示了如何获取数据、处理页码,并确保在总页数过多时只显示有限的页码范围。在HTML模板中,利用Jinja2语法展示了分页链接的生成。此外,还讨论了Django模板与Jinja2模板引擎在调用对象方法上的区别。
摘要由CSDN通过智能技术生成

分页器

1.视图函数

def paginator(request):
    a = Books.objects.all().order_by("pk")
    paginator1 = Paginator(a, 3)
    print("数据总数:", paginator1.count)
    print("总页数:", paginator1.num_pages)
    print("页码列表:", paginator1.page_range)
    page1 = paginator1.page(1)
    print("下一页数:", page1.next_page_number())
    print("下一页", page1.has_next())
    page2 = paginator1.page(2)
    print("上一页数:", page2.previous_page_number())
    print("上一页:", page2.has_previous())

    # 抛错
    # page=paginator.page(12)   # error:EmptyPage
    # page=paginator.page("z")   # error:PageNotAnInteger

    current_page_num = int(request.GET.get("page", 1))
    try:
        current_page = paginator1.page(current_page_num)
        print("object_list", current_page.object_list)
    except EmptyPage as e:
        current_page = paginator1.page(1)
    except PageNotAnInteger as e:
        current_page = paginator1.page(paginator1.count)

    # 需求:总页数54,使其永远只显示11页
    if paginator1.num_pages > 11:
        if current_page_num - 5 < 1:
            page_range = range(1, 12)
        elif current_page_num + 5 > paginator1.num_pages:
            page_range = range(paginator1.num_pages - 10, paginator1.num_pages + 1)
        else:
            page_range = range(current_page_num - 5, current_page_num + 6)
    else:
        page_range = paginator1.page_range

    dict1 = {
        "page_range": page_range,
        "current_page_num": current_page_num,
        "current_page": current_page,
    }

    return render(request, "paginator.html", dict1)

2.html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>paginator</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css"
          integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<ul>
    {% for book in current_page %}
        <li>{{ book.title }}:{{ book.price }}</li>
    {% endfor %}
</ul>


{#分页器#}
<nav aria-label="Page navigation">
    <ul class="pagination">
        {% if current_page.has_previous() %}
            <li>
                <a href="?page={{ current_page.previous_page_number() }}" aria-label="Previous">
                    <span aria-hidden="true">上一页</span>
                </a>
            </li>
        {% else %}
            <li class="disabled"><a href="" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>
        {% endif %}


        {% for item in page_range %}
            {% if current_page_num == item %}
                <li class="active"><a href="?page={{ item }}">{{ item }}</a></li>
            {% else %}
                <li><a href="?page={{ item }}">{{ item }}</a></li>
            {% endif %}
        {% endfor %}


        {% if current_page.has_next() %}
            <li>
                <a href="?page={{ current_page.next_page_number() }}" aria-label="Next"><span
                        aria-hidden="true">下一页</span></a>
            </li>
        {% else %}
            <li class="disabled"><a href="" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
        {% endif %}

    </ul>
</nav>
</body>
</html>

问题1

在需要进行查询的语句中增加order_by排序
return SKU.objects.filter(category_id=category_id).order_by()

问题2

Jinja2在调用对象的方法时不同于调用Django模板引擎对象的方法,Jinja2的方法于python函数调用方法一致需要加括号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值