在Django中如何对搜索浏览的条目进行排序?是否需要使用JavaScript?
这个排序功能纯Django即可实现,只有需要无刷新切换排序效果的时候才需要搭配JavaScript使用。你当前功能失效的核心原因是:搜索和排序用了两个独立的表单,提交排序表单时不会携带之前输入的搜索关键词,导致后端拿到的search参数为空,筛选的商品范围和你之前搜索的结果不一致。
HTML部分修改
你可以二选一:
- 方案1:将排序选择框合并到搜索表单内,两个功能共用同一个提交表单,提交时会自动携带搜索关键词和排序参数,额外加了提交后保留输入内容、保留选中排序方式的逻辑:
<form action="{% url 'search-page'%}" class="navbar__search-form" method="GET"> <input name="search" class="navbar__search-text" type="text" placeholder="Search for an item." value="{{ request.GET.search }}"> <div class="sort__wrap"> <h1 class="sort__header">SORT ITEMS</h1> <select class="sort__select" name="select"> <option disabled {% if not request.GET.select %}selected{% endif %}> Sorting method</option> <option value="v1" {% if request.GET.select == 'v1' %}selected{% endif %}>Price: low to high</option> <option value="v2" {% if request.GET.select == 'v2' %}selected{% endif %}>Price: high to low</option> </select> </div> <button class="sort__submit">SORT</button> </form>
- 方案2:如果需要保留两个表单的布局,在排序表单内加一个隐藏输入框,继承当前的搜索关键词即可:
<form action="{% url 'search-page'%}" class = "sort__form" method="GET"> <!-- 新增隐藏输入框携带搜索参数 --> <input type="hidden" name="search" value="{{ request.GET.search }}"> <h1 class="sort__header"> SORT ITEMS </h1> <select class= "sort__select" name="select"> <option disabled selected> Sorting method</option> <option value="v1">Price: low to high</option> <option value="v2">Price: high to low</option> </select> <button class="sort__submit">SORT</button> </form>
views.py部分优化
你当前写的try-except完全没有必要,request.GET.get默认返回None不会触发UnboundLocalError,同时不用拆分两个模板渲染,优化后代码如下:
def searchView(request): if request.method == "GET": search_keyword = request.GET.get('search', '') items = Item.objects.all().filter(title__icontains=search_keyword) sorting_method = request.GET.get('select') if sorting_method == 'v1': items = items.order_by('price') elif sorting_method == 'v2': items = items.order_by('-price') # 统一用同一个模板渲染即可 return render(request, 'shop/search.html', {'items': items})
如果需要保留异常跳转首页的逻辑,可以单独加参数校验规则,无需包裹整个排序逻辑段。
内容的提问来源于stack exchange,提问作者user17299695
相关产品推荐
相关产品推荐

