Django 4.x 智能分页get_elided_page_range

Django智能分页

分页效果

  • 第1页的效果
  • 第10页的效果
  • 带输入框的效果

主要函数

python 复制代码
# 参数解释
# number: 当前页码,默认:1
# on_each_side:当前页码前后显示几页,默认:3
# on_ends:首尾固定显示几页,默认:2
Paginator.get_elided_page_range(number, on_each_side=3, on_ends=2)

代码部分

  • 接口查询
python 复制代码
# 获取列表信息
def events(request):
	
	event_list = Event.objects.all().order_by("-level", "-begin")
	# 分页部分的代码
	page_number = request.GET.get('page', 1)
	paginator = Paginator(event_list, 15)
    page_obj = paginator.get_page(page_number)
    page_range = paginator.get_elided_page_range(number=page_number, on_each_side=3, on_ends=2)
    
    return render(request, "events.html", {"page_obj": page_obj, "page_range": page_range})
  • 前端展示
html 复制代码
...
{#分页代码,业务代码请自行补充即可#}
{% if page_obj.has_other_pages %}
  <nav>
    <ul class="pagination justify-content-center">
      {% if page_obj.has_previous %}
        <li class="page-item"><a class="page-link" href="?page={{ page_obj.previous_page_number }}">上一页</a></li>
      {% else %}
        <li class="page-item disabled"><a class="page-link" href="#">上一页</a></li>
      {% endif %}
      
      {% for item in page_range %}
          {% if item == page_obj.number %}
            <li class="page-item active"><a class="page-link" href="?page={{ item }}">{{ item }}</a></li>
          {% elif item == '...' %}
            <li class="page-item"><a class="page-link" href="#">{{ item }}</a></li>
          {% else %}
            <li class="page-item"><a class="page-link" href="?page={{ item }}">{{ item }}</a></li>
          {% endif %}
      {% endfor %}

      {% if page_obj.has_next %}
        <li class="page-item"><a class="page-link" href="?page={{ page_obj.next_page_number }}">下一页</a></li>
      {% else %}
        <li class="page-item disabled"><a class="page-link" href="#">下一页</a></li>
      {% endif %}
    </ul>
  </nav>
{% endif %}

带输入框的效果部分代码

  • 接口查询时添加了总页数
python 复制代码
def events(request):
	
	event_list = Event.objects.all().order_by("-level", "-begin")
	# 分页部分的代码
	page_number = request.GET.get('page', 1)
	paginator = Paginator(event_list, 15)
    page_obj = paginator.get_page(page_number)
    num_pages = paginator.num_pages  # 获取总共有多少页
    page_range = paginator.get_elided_page_range(number=page_number, on_each_side=3, on_ends=2)
    
    return render(request, "events.html", {"page_obj": page_obj, "page_range": page_range, "num_pages ":num_pages })
  • 前端部分添加了输入框
html 复制代码
{% if page_obj.has_other_pages %}
  <nav>
    <ul class="pagination justify-content-center">
      {% if page_obj.has_previous %}
        <li class="page-item"><a class="page-link" href="?page={{ page_obj.previous_page_number }}">上一页</a></li>
      {% else %}
        <li class="page-item disabled"><a class="page-link" href="#">上一页</a></li>
      {% endif %}
      
      {% for item in page_range %}
          {% if item == page_obj.number %}
            <li class="page-item active"><a class="page-link" href="?page={{ item }}">{{ item }}</a></li>
          {% elif item == '...' %}
            <li class="page-item"><a class="page-link" href="#">{{ item }}</a></li>
          {% else %}
            <li class="page-item"><a class="page-link" href="?page={{ item }}">{{ item }}</a></li>
          {% endif %}
      {% endfor %}

      {% if page_obj.has_next %}
        <li class="page-item"><a class="page-link" href="?page={{ page_obj.next_page_number }}">下一页</a></li>
      {% else %}
        <li class="page-item disabled"><a class="page-link" href="#">下一页</a></li>
      {% endif %}
      # 对input输入进行了限制[1, num_pages],防止越界输入# 
      <li class="page-item">&nbsp;共{{ num_pages }}页<label for="p_num">&nbsp;到第</label><input type="text" oninput="if(value>{{ num_pages }})value={{ num_pages }};if(value<0)value=1" id="p_num">页&nbsp;</li>
      #这里引入了一个button点击事件#
      <li class="page-item"><button class="page-link" id="submit">确定</button></li></ul>
  </nav>
{% endif %}
  • 点击事件处理
javascript 复制代码
 // 就是一个跳转,本想在这里处理输入页码检查的,觉得麻烦就改成input上的输入限制了。
 $("#submit").click(function () {
      let page_number = $("#p_num").val();
      window.location.href=`?page=${page_number}`  
  });
相关推荐
酷飞飞1 天前
Python网络与多任务编程:TCP/UDP实战指南
网络·python·tcp/ip
数字化顾问1 天前
Python:OpenCV 教程——从传统视觉到深度学习:YOLOv8 与 OpenCV DNN 模块协同实现工业缺陷检测
python
学生信的大叔1 天前
【Python自动化】Ubuntu24.04配置Selenium并测试
python·selenium·自动化
计算机编程小央姐1 天前
跟上大数据时代步伐:食物营养数据可视化分析系统技术前沿解析
大数据·hadoop·信息可视化·spark·django·课程设计·食物
诗句藏于尽头1 天前
Django模型与数据库表映射的两种方式
数据库·python·django
智数研析社1 天前
9120 部 TMDb 高分电影数据集 | 7 列全维度指标 (评分 / 热度 / 剧情)+API 权威源 | 电影趋势分析 / 推荐系统 / NLP 建模用
大数据·人工智能·python·深度学习·数据分析·数据集·数据清洗
扯淡的闲人1 天前
多语言编码Agent解决方案(5)-IntelliJ插件实现
开发语言·python
moxiaoran57531 天前
Flask学习笔记(一)
后端·python·flask
秋氘渔1 天前
迭代器和生成器的区别与联系
python·迭代器·生成器·可迭代对象
Gu_shiwww1 天前
数据结构8——双向链表
c语言·数据结构·python·链表·小白初步