Django单页使用3个独立筛选表单时GET筛选无效问题如何解决?
问题根因
你的判断完全正确,问题确实出在if-elif分支逻辑上。Python的条件判断是顺序执行的,只要匹配到第一个符合条件的分支就会直接执行对应代码并跳出判断,不会再执行后续分支。你写了两个elif request.method == "GET"分支,所有GET请求都会匹配到第一个等级筛选的GET分支,根本不会走到学派筛选的分支里。
当你提交学派筛选的表单时,GET参数里只有filter-search-school没有filter-search-level,所以第一个GET分支里request.GET.get('filter-search-level')拿到的是None,用spell_level=None去过滤数据库自然查不到任何结果,这就是返回列表为空的原因。
修复方案
不需要为每个GET请求单独编写视图,直接修改现有视图逻辑即可:进入GET分支后,先判断当前GET请求携带的是哪个筛选参数,再执行对应的过滤逻辑。
修改后的views.py代码如下:
def spells(request): # 处理POST的名称筛选 if request.method == "POST": spellz = request.POST.get('filter-search-name') spells = Underdark_Spells.objects.filter(spell_name__icontains=spellz).order_by('spell_name') return render(request, 'spells.html', {'spells': spells}) # 处理所有GET请求 elif request.method == "GET": # 判断是否为等级筛选请求 if 'filter-search-level' in request.GET: level = request.GET.get('filter-search-level') spells = Underdark_Spells.objects.filter(spell_level=level).order_by('spell_name') # 判断是否为学派筛选请求 elif 'filter-search-school' in request.GET: school = request.GET.get('filter-search-school') spells = Underdark_Spells.objects.filter(spell_school=school).order_by('spell_name') # 无筛选参数返回全部结果 else: spells = Underdark_Spells.objects.all().order_by('spell_name') return render(request, 'spells.html', {'spells': spells}) # 其他请求类型返回全部结果 else: spells = Underdark_Spells.objects.all().order_by('spell_name') return render(request, 'spells.html', {'spells': spells}) def __str__(self): return self.name
可选优化建议
如果后续需要支持同时按多个条件筛选,建议把三个表单合并成一个,全部用GET方法提交,视图里叠加过滤条件即可,代码更简洁,用户使用也更方便,示例逻辑如下:
elif request.method == "GET": spells = Underdark_Spells.objects.all() # 按名称筛选(可把名称表单也改成GET方法支持多条件组合) if 'filter-search-name' in request.GET: name = request.GET.get('filter-search-name') spells = spells.filter(spell_name__icontains=name) # 按等级筛选 if 'filter-search-level' in request.GET: level = request.GET.get('filter-search-level') spells = spells.filter(spell_level=level) # 按学派筛选 if 'filter-search-school' in request.GET: school = request.GET.get('filter-search-school') spells = spells.filter(spell_school=school) spells = spells.order_by('spell_name') return render(request, 'spells.html', {'spells': spells})
内容的提问来源于stack exchange,提问作者ray55nl
相关产品推荐
相关产品推荐

