Django中如何根据下拉菜单选值实现数据库条目分页展示
Django 下拉选值联动分页实现
直接用Django自带分页组件就能做,不用额外装第三方库,三步搞定:
前端模板修改
把你现有的下拉选项套一层GET表单,加个选中自动提交的事件,同时补上分页导航,所有分页跳转链接都带上选中的每页条数参数,避免翻页时条数重置:
<!-- 每页条数选择器 --> <form method="get" id="sizeForm"> <select name="page_size" onchange="document.getElementById('sizeForm').submit()"> <option value="1" {% if page_size == 1 %}selected{% endif %}>1条/页</option> <option value="5" {% if page_size == 5 %}selected{% endif %}>5条/页</option> <option value="10" {% if page_size == 10 %}selected{% endif %}>10条/页</option> <option value="20" {% if page_size == 20 %}selected{% endif %}>20条/页</option> </select> </form> <!-- 数据展示区,替换成你自己的模型字段即可 --> <div class="data-list"> {% for entry in page_obj %} <div class="data-item">{{ entry.需要展示的字段名 }}</div> {% endfor %} </div> <!-- 分页导航 --> <div class="pager"> {% if page_obj.has_previous %} <a href="?page=1&page_size={{ page_size }}">首页</a> <a href="?page={{ page_obj.previous_page_number }}&page_size={{ page_size }}">上一页</a> {% endif %} <span>第{{ page_obj.number }}页 / 共{{ page_obj.paginator.num_pages }}页</span> {% if page_obj.has_next %} <a href="?page={{ page_obj.next_page_number }}&page_size={{ page_size }}">下一页</a> <a href="?page={{ page_obj.paginator.num_pages }}&page_size={{ page_size }}">尾页</a> {% endif %} </div>
不用写复杂的异步请求,这个实现新手零门槛,打开就能用。
后端视图逻辑
直接用Django内置的Paginator类,自动帮你算总页数、切分数据,记得加参数合法性校验,避免有人手动改URL传非法值拖垮数据库:
from django.core.paginator import Paginator from django.shortcuts import render from .models import 你的数据模型类 # 替换成你自己存100条数据的模型 def data_list_view(request): # 取出全量数据 data_set = 你的数据模型类.objects.all() # 读取前端传的每页条数,默认值设10,做白名单校验 try: page_size = int(request.GET.get("page_size", 10)) # 只允许你预设的四个值,其他值强制改回默认 if page_size not in [1,5,10,20]: page_size = 10 except ValueError: page_size = 10 # 实例化分页器,传入数据和每页条数,总页数自动计算 paginator = Paginator(data_set, page_size) # 读取当前请求的页码 current_page = request.GET.get("page", 1) # 获取当前页要展示的数据,自动处理非法页码 page_obj = paginator.get_page(current_page) # 传给模板渲染 return render(request, "你的模板文件路径.html", { "page_obj": page_obj, "page_size": page_size })
路由配置
别忘了给视图配个访问路由,在app的urls.py里加上对应路径就行,和你普通视图的路由写法完全一致。
配完直接访问就能看到效果:选20的时候自动切为每页20条、共5页,选10的时候自动切为每页10条、共10页,翻页时每页条数会保持你选中的状态,不会重置。
内容的提问来源于stack exchange,提问作者Newbie coder
相关产品推荐
相关产品推荐

