Django单选按钮控制表格排序失效,搜索后保留排序如何解决
问题修复方案
第一步:修改 views.py 处理排序逻辑
你原有视图未读取URL中的sortType参数,排序规则一直是默认的按时间倒序,是排序不生效的根本原因。修改后的视图代码如下:
@login_required() def ViewMCO(request): # 先获取所有请求参数 search_post = request.GET.get('q', '') sort_type = request.GET.get('sortType', '-Datetime') # 默认按时间倒序 # 校验排序字段合法性,避免SQL注入风险 allowed_sort_fields = ['partno', 'serialno', 'reception', 'mcoNum', 'Customername', '-Datetime'] if sort_type not in allowed_sort_fields: sort_type = '-Datetime' # 处理搜索逻辑 if search_post: allusername = Photo.objects.filter( Q(reception__icontains=search_post) | Q(partno__icontains=search_post) | Q(Customername__icontains=search_post) | Q(mcoNum__icontains=search_post) | Q(status__icontains=search_post) | Q(serialno__icontains=search_post) ) if not allusername.exists(): allusername = Photo.objects.all() else: allusername = Photo.objects.all() # 统一应用排序规则,不管是否有搜索结果 allusername = allusername.order_by(sort_type) # 分页逻辑保持不变 page = request.GET.get('page') paginator = Paginator(allusername, 6) try: allusername = paginator.page(page) except PageNotAnInteger: allusername = paginator.page(1) except EmptyPage: allusername = paginator.page(paginator.num_pages) # 把当前排序参数传入模板,后续渲染需要 context = {'allusername': allusername, 'query': search_post, 'current_sort': sort_type} return render(request, 'ViewMCO.html', context)
第二步:修改 ViewMCO.html 解决参数丢失问题
原有搜索、排序是两个独立表单,提交其中一个时会丢失另一个的参数,需要添加隐藏字段同步参数,同时修改分页链接携带排序参数。
1. 搜索表单添加排序隐藏字段
找到搜索表单代码,在表单内部新增隐藏input,提交搜索时保留当前排序规则:
<form class="form-inline my-2 my-lg-0" action="{% url 'ViewMCO' %}" method='GET'> <!-- 新增隐藏字段,同步当前排序参数 --> <input type="hidden" name="sortType" value="{{ current_sort }}"> <input class="form-control mr-sm-2" type="text" placeholder="Search" aria-label="Search" name="q" value='{{ request.GET.q }}'/> <button class="btn btn-outline-success my-2 my-sm-0" type="submit">搜索</button> </form>
2. 排序表单添加搜索词隐藏字段,同时让单选按钮默认选中当前排序
找到排序表单代码,修改如下:
<form class="form-inline my-2 my-lg-0" action="{% url 'ViewMCO' %}" method='GET'> <!-- 新增隐藏字段,同步当前搜索词 --> <input type="hidden" name="q" value="{{ query|urlencode }}"> <div class="sort"> <input type="radio" id="partno" name="sortType" value="partno" {% if current_sort == 'partno' %}checked{% endif %}> <label for="partno">Part Number</label> </div> <div class="sort"> <input type="radio" id="serialno" name="sortType" value="serialno" {% if current_sort == 'serialno' %}checked{% endif %}> <label for="serialno">Serial Number</label> </div> <div class="sort"> <input type="radio" id="receptionno" name="sortType" value="reception" {% if current_sort == 'reception' %}checked{% endif %}> <label for="receptionno">Reception Number</label> </div> <div class="sort"> <input type="radio" id="mcoNum" name="sortType" value="mcoNum" {% if current_sort == 'mcoNum' %}checked{% endif %}> <label for="mcoNum">MCO Number</label> </div> <div class="sort"> <input type="radio" id="Customername" name="sortType" value="Customername" {% if current_sort == 'Customername' %}checked{% endif %}> <label for="Customername">Customer Name</label> </div> <div class="sort"> <input type="Submit" value="Sort"/> </div> </form>
3. 分页链接添加排序参数,避免翻页丢失排序规则
找到所有分页的a标签,给href补充sortType参数:
<!-- 上一页链接 --> <li><a href="?q={{ query|urlencode }}&sortType={{ current_sort }}&page={{ allusername.previous_page_number }}">«</a></li> <!-- 页码链接 --> <li><a href="?q={{ query|urlencode }}&sortType={{ current_sort }}&page={{ i }}">{{ i }}</a></li> <!-- 下一页链接 --> <li><a href="?q={{ query|urlencode }}&sortType={{ current_sort }}&page={{ allusername.next_page_number }}">»</a></li>
修改完成后即可实现:点击单选按钮后数据按选中字段升序排序,搜索过滤后排序规则保持不变,翻页时搜索、排序规则都不会丢失。
内容的提问来源于stack exchange,提问作者Rainysky
相关产品推荐
相关产品推荐

