Python学习第十九天

Django-分页

后端分页

Django提供了Paginator类来实现后端分页。Paginator类可以将一个查询集(QuerySet)分成多个页面,每个页面包含指定数量的对象。

python 复制代码
from django.shortcuts import render, redirect, get_object_or_404
from .models import User
from .forms import UserForm
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

'''
    用户列表
'''
def user_list(request):
    user_list = User.objects.all()

    # 处理自定义值
    try:
        # 获取用户选择的每页显示数量,默认为 10
        per_page = int(request.GET.get('per_page', 10))
        per_page = int(per_page)  # 将 per_page 转换为整数
        if per_page <= 0:  # 如果输入的值小于等于0,设置为默认值10
            per_page = 10
    except (ValueError, TypeError):  # 如果 per_page 不是数字,设置为默认值10
        per_page = 10

    # 分页
    paginator = Paginator(user_list, per_page)
    page_number = request.GET.get('page')
    try:
        page_obj = paginator.get_page(page_number)  # 获取当前页
    except PageNotAnInteger:  # 如果 page 不是整数,跳转到第一页
        page_obj = paginator.get_page(1)
    except EmptyPage:  # 如果 page 超出范围,跳转到最后一页
        page_obj = paginator.get_page(paginator.num_pages)

    # 允许的每页显示数量列表
    allowed_per_page = [10, 20, 50, 100, 200]

    return render(request, 'myapp/user_list.html', {
        'page_obj': page_obj,
        'per_page': per_page,  # 将每页显示数量传递给模板
        'allowed_per_page': allowed_per_page,

    })

前端分页

通用前端的分页代码支持输入页码,也支持选择页码,跳转到对应页面

html 复制代码
<nav aria-label="Page navigation" class="mt-4">
    <ul class="pagination justify-content-center">
        <!-- 首页按钮 -->
        {% if page_obj.has_previous %}
            <li class="page-item">
                <a class="page-link" href="?page=1&per_page={{ per_page }}" aria-label="First">
                    <span aria-hidden="true">首页</span>
                </a>
            </li>
        {% else %}
            <li class="page-item disabled">
                <span class="page-link">首页</span>
            </li>
        {% endif %}

        <!-- 上一页按钮 -->
        {% if page_obj.has_previous %}
            <li class="page-item">
                <a class="page-link" href="?page={{ page_obj.previous_page_number }}&per_page={{ per_page }}" aria-label="Previous">
                    <span aria-hidden="true">上一页</span>
                </a>
            </li>
        {% else %}
            <li class="page-item disabled">
                <span class="page-link">上一页</span>
            </li>
        {% endif %}

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

        <!-- 下一页按钮 -->
        {% if page_obj.has_next %}
            <li class="page-item">
                <a class="page-link" href="?page={{ page_obj.next_page_number }}&per_page={{ per_page }}" aria-label="Next">
                    <span aria-hidden="true">下一页</span>
                </a>
            </li>
        {% else %}
            <li class="page-item disabled">
                <span class="page-link">下一页</span>
            </li>
        {% endif %}

        <!-- 末页按钮 -->
        {% if page_obj.has_next %}
            <li class="page-item">
                <a class="page-link" href="?page={{ page_obj.paginator.num_pages }}&per_page={{ per_page }}" aria-label="Last">
                    <span aria-hidden="true">末页</span>
                </a>
            </li>
        {% else %}
            <li class="page-item disabled">
                <span class="page-link">末页</span>
            </li>
        {% endif %}
    </ul>

    <!-- 输入页码跳转和选择每页显示数量 -->
    <div class="d-flex justify-content-center mt-3">
        <!-- 输入页码跳转 -->
        <form method="get" action="" class="form-inline mr-3">
            <div class="input-group">
                <input type="number" name="page" class="form-control" min="1" max="{{ page_obj.paginator.num_pages }}"
                       placeholder="页码" aria-label="页码" required>
                <input type="hidden" name="per_page" value="{{ per_page }}">
                <div class="input-group-append">
                    <button type="submit" class="btn btn-outline-primary">跳转</button>
                </div>
            </div>
        </form>

        <!-- 选择每页显示数量 -->
        <form method="get" action="" class="form-inline">
            <div class="input-group">
                <select name="per_page" class="form-control" aria-label="每页显示数量" onchange="this.form.submit()">
                    <option value="10" {% if per_page == 10 %}selected{% endif %}>10 条/页</option>
                    <option value="20" {% if per_page == 20 %}selected{% endif %}>20 条/页</option>
                    <option value="50" {% if per_page == 50 %}selected{% endif %}>50 条/页</option>
                    <option value="100" {% if per_page == 100 %}selected{% endif %}>100 条/页</option>
                    <option value="200" {% if per_page == 200 %}selected{% endif %}>200 条/页</option>

                    <option value="1" {% if per_page != 10 and per_page != 20 and per_page != 50 and per_page != 100 and per_page != 200 %}selected{% endif %}>自定义</option>
                </select>
                {% if per_page != 10 and per_page != 20 and per_page != 50 and per_page != 100 and per_page != 200 %}
                    <input type="number" name="per_page" class="form-control ml-2" min="1"
                           value="{{ per_page }}" placeholder="自定义" aria-label="自定义" required>
                {% endif %}
            </div>
        </form>
    </div>
</nav>
相关推荐
进阶小白猿1 小时前
Java技术八股学习Day36
学习
开源技术2 小时前
Python Pillow 优化,打开和保存速度最快提高14倍
开发语言·python·pillow
Li emily2 小时前
解决港股实时行情数据 API 接入难题
人工智能·python·fastapi
wfeqhfxz25887823 小时前
农田杂草检测与识别系统基于YOLO11实现六种杂草自动识别_1
python
mftang3 小时前
Python 字符串拼接成字节详解
开发语言·python
四维碎片3 小时前
【Qt】UDP跨平台调试工具
qt·学习·udp
0思必得03 小时前
[Web自动化] Selenium设置相关执行文件路径
前端·爬虫·python·selenium·自动化
石去皿3 小时前
大模型面试通关指南:28道高频考题深度解析与实战要点
人工智能·python·面试·职场和发展
jasligea4 小时前
构建个人智能助手
开发语言·python·自然语言处理
好奇龙猫4 小时前
【人工智能学习-AI入试相关题目练习-第十八次】
人工智能·学习