如何默认隐藏条目列表,仅在搜索后显示匹配结果?
实现默认仅显示搜索框、搜索后展示匹配结果的功能
需求:现有页面默认展示所有元素列表,输入搜索值后显示匹配元素。需要改成默认只显示搜索框,执行搜索后才展示匹配的元素。
方案一:合并视图(推荐,简化代码)
1. 修改 views.py
原代码里HomeView会返回所有申请数据,导致默认显示全量列表。直接把搜索逻辑合并到HomeView里,默认返回空数据,只有搜索时才返回匹配结果:
from django.views.generic import ListView from .models import Application class HomeView(ListView): model = Application template_name = 'home.html' def get_queryset(self): # 获取用户输入的搜索关键词 search_key = self.request.GET.get("q") if search_key: # 有搜索词就返回匹配的申请记录 return Application.objects.filter(appnumber__icontains=search_key) # 默认返回空集合,不显示任何列表 return Application.objects.none() def get_context_data(self, *args, **kwargs): context = super().get_context_data(*args, **kwargs) # 把搜索词传到模板,用于输入框回显 context["q"] = self.request.GET.get("q") return context
2. 修改 urls.py
合并视图后,不需要单独的Search路由了,删掉它只保留HomeView:
from django.urls import path from .views import HomeView urlpatterns = [ path('', HomeView.as_view(), name="home"), ]
3. 修改 home.html
调整表单提交地址为当前页面,并且只有搜索后才显示结果区域,还能处理无匹配的情况:
<div class="headtext"> <form method="GET" action="{% url 'home' %}"> <input type="search" name="q" placeholder="输入申请编号" value="{{ q }}"> <button type="submit">查找</button> </form> </div> <!-- 只有执行过搜索,才展示结果列表 --> {% if q %} <div> {% for application in object_list %} <div> <p>申请编号: {{ application.appnumber }}, 状态: {{ application.status }}</p> </div> {% empty %} <p>未找到匹配的申请记录</p> {% endfor %} </div> {% endif %}
细节说明:
- 输入框加
value="{{ q }}",搜索后能保留关键词,方便用户调整搜索内容 - 用
{% if q %}判断,没搜索时完全不显示结果区域 - 加
{% empty %}处理搜不到的情况,避免页面空落落的
方案二:保留原有双视图结构
如果不想改路由结构,也可以保留原来的HomeView和Search视图,只做小调整:
1. 修改 views.py 的HomeView
让HomeView默认返回空数据:
class HomeView(ListView): model = Application template_name = 'home.html' # 默认不返回任何数据 queryset = Application.objects.none()
Search视图保持不变即可。
2. 修改 home.html
只需要加个判断,只有搜索后才显示结果:
<div class="headtext"> <form method="GET" action="{% url 'search' %}"> <input type="search" name="q" placeholder="输入申请编号" value="{{ q }}"> <button type="submit">查找</button> </form> </div> {% if q %} <div> {% for application in object_list %} <div> <p>申请编号: {{ application.appnumber }}, 状态: {{ application.status }}</p> </div> {% empty %} <p>未找到匹配的申请记录</p> {% endfor %} </div> {% endif %}
内容的提问来源于stack exchange,提问作者Stew
相关产品推荐
相关产品推荐

