Django实现表格分页后如何添加可检索所有页面数据的搜索框
实现全表搜索+分页功能方案
1. 调整views.py逻辑
核心逻辑是先根据搜索关键词过滤全表数据,再对过滤后的结果做分页,避免搜索只作用于单页数据。修改后的代码如下:
def Browse_and_adopt(request): # 获取搜索关键词 search_q = request.GET.get('search', '').strip() # 先过滤全表数据 if search_q: Title_list = Title.objects.filter(title__icontains=search_q) else: Title_list = Title.objects.all() page = request.GET.get('page', 1) paginator = Paginator(Title_list, 10) # get_page已经自动处理页码非法、空页异常,原有try-except逻辑可直接删除 page_obj = paginator.get_page(page) # 将搜索关键词传回模板,用于表单回填和分页参数传递 return render(request, 'bms/inbox/Browse_and_adopt.html', {'page_obj': page_obj, 'search_q': search_q})
注:原有代码中
Titles和page_obj作用重复,模板里只用了page_obj,所以可以直接删除冗余的Titles相关逻辑。
2. 调整Browse_and_adopt.html模板
需要新增搜索提交表单,同时修改分页链接,保证切换分页时搜索参数不会丢失:
<!-- 新增搜索表单,放在表格上方 --> <div class="search-box"> <form method="get" action=""> <input type="text" name="search" placeholder="请输入标题关键词" value="{{ search_q }}"> <button type="submit">搜索</button> </form> </div> <table id="myTable"> <thead> <tr> <th>Title</th> </tr> </thead> <tbody> {% for book in page_obj %} <tr> <td>{{ book.title }}</td> </tr> {% endfor %} </tbody> </table> <div class="pagination"> <span class="step-links"> {% if page_obj.has_previous %} <!-- 分页链接追加搜索参数 --> <a href="?page=1&search={{ search_q }}">« first</a> <a href="?page={{ page_obj.previous_page_number }}&search={{ search_q }}">previous</a> {% endif %} <span class="current"> Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}. </span> {% if page_obj.has_next %} <!-- 分页链接追加搜索参数 --> <a href="?page={{ page_obj.next_page_number }}&search={{ search_q }}">next</a> <a href="?page={{ page_obj.paginator.num_pages }}&search={{ search_q }}">last »</a> {% endif %} </span> </div>
功能说明
修改后搜索请求会先从全表匹配符合条件的记录,再对匹配结果做分页,所有分页的内容都属于搜索命中的结果,切换分页时搜索参数会一直携带,不会出现跳转分页后搜索条件失效的问题。
内容的提问来源于stack exchange,提问作者Django
相关产品推荐
相关产品推荐

