Django搜索结果按价格高低排序失效及报错问题排查
问题原因
- 报错根本原因:点击排序按钮时,请求URL仅携带
sort参数,未携带之前的search搜索关键词参数,导致视图中request.GET.get('search')取值为None,无法进入if search_item分支,视图没有返回任何HttpResponse对象,触发返回None的报错。 - 潜在逻辑缺陷:当前视图仅判断了
sort=l2h和sort=h2l两种情况,若sort参数为其他值,item变量未定义会触发NameError;且未对无搜索参数的场景做兜底处理。 - 前端链接缺陷:排序按钮的href未动态拼接当前搜索关键词,导致每次点击排序都会丢失搜索条件。
修复方案
第一步:修复视图层代码
补充无搜索参数的兜底逻辑,优化排序判断的兜底规则,同时将搜索关键词传递到模板供前端拼接链接:
from django.shortcuts import redirect, reverse # 无该导入请补充 class search_item(View): def get(self, request): search_item = request.GET.get('search') # 无搜索关键词时兜底,可跳转回搜索页/首页,替换为你项目对应路由的name即可 if not search_item: return redirect(reverse('你的搜索页/首页路由name')) items = Item.objects.filter(Q(name__icontains=search_item)|Q(color__icontains=search_item)) sort_by = request.GET.get("sort", "l2h") # 兜底排序规则,避免sort参数异常时变量未定义 if sort_by == "h2l": items = items.order_by("-price") else: # 默认按价格从低到高排序 items = items.order_by("price") # 将搜索关键词传递给模板,用于拼接排序链接 return render(request, 'search_result.html', {'items':items, 'search_key': search_item})
第二步:修复前端排序按钮代码
在排序链接中拼接当前搜索关键词,确保点击排序时不会丢失搜索条件:
<li><a class="dropdown-item" href="?search={{ search_key }}&sort=l2h">Low To High</a></li> <li><a class="dropdown-item" href="?search={{ search_key }}&sort=h2l">High To Low</a></li>
内容的提问来源于stack exchange,提问作者Shreyash mishra
相关产品推荐
相关产品推荐

