Django中提交搜索后如何保留搜索栏内已输入的搜索内容
Django搜索提交后保留输入框内容配置方法
核心思路是把用户提交的搜索关键词随搜索结果一起回传到模板,绑定到搜索输入框的value属性即可,不需要额外安装插件或修改全局配置,按以下两步操作:
1. 视图层:将搜索关键词传入模板上下文
无论使用函数视图还是类视图,拿到用户提交的搜索参数后,将参数加入渲染模板的上下文字典即可,以下是两种常见视图的参考代码:
函数视图示例
from django.shortcuts import render from .models import Post # 替换为你自己的模型类 def post_search(request): # 如果你用POST提交搜索,把GET换成POST即可,搜索场景更推荐GET方式 keyword = request.GET.get('search', '') result_list = [] if keyword: # 保留你原有的搜索逻辑,以下仅为示例 result_list = Post.objects.filter(title__icontains=keyword) # 把搜索关键词和结果一起传入模板 return render(request, 'search.html', { 'results': result_list, 'search_keyword': keyword })
类视图示例
from django.views.generic import ListView from .models import Post class PostSearchView(ListView): model = Post template_name = 'search.html' context_object_name = 'results' def get_queryset(self): self.keyword = self.request.GET.get('search', '') if self.keyword: return Post.objects.filter(title__icontains=self.keyword) return Post.objects.none() def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 将关键词加入上下文 context['search_keyword'] = self.keyword return context
2. 模板层:绑定输入框value属性
找到模板中搜索表单的输入框代码,给value属性绑定回传的search_keyword模板变量即可,Django模板默认会对变量做HTML转义,无需额外处理XSS风险:
<form method="get" action="{% url 'post_search' %}"> <!-- 核心是添加value="{{ search_keyword }}"配置 --> <input type="text" name="search" placeholder="请输入搜索关键词" value="{{ search_keyword }}" > <button type="submit">搜索</button> </form> <!-- 原有搜索结果渲染逻辑保持不变 --> {% for item in results %} <div class="result-item"> <h3>{{ item.title }}</h3> <p>{{ item.content|truncatechars:100 }}</p> </div> {% empty %} <p>暂无匹配的搜索结果</p> {% endfor %}
如果你使用Django自带的Form组件实现搜索表单,不需要手动给input标签加value属性,只要在实例化表单时传入用户提交的参数,Django会自动渲染保留输入值:
# 视图层示例 from .forms import SearchForm def post_search(request): form = SearchForm(request.GET or None) result_list = [] if form.is_valid(): keyword = form.cleaned_data['search'] result_list = Post.objects.filter(title__icontains=keyword) return render(request, 'search.html', {'form': form, 'results': result_list})模板层直接渲染表单字段即可自动保留输入:
<form method="get" action="{% url 'post_search' %}"> {% csrf_token %} {{ form.search }} <button type="submit">搜索</button> </form>
内容的提问来源于stack exchange,提问作者Bibek
相关产品推荐
相关产品推荐

