You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Django中实现基于关键词过滤的简单搜索功能技术问询

帮你搞定Django搜索过滤功能的问题

嘿,我来梳理下你代码里的问题,然后给你修正后的完整实现方案~

先看HTML表单的问题

你的表单代码有几个小错误:

  • input标签重复写了type属性:type="search" type="text",只需要保留一个type="search"就可以
  • placeholder用了中文引号„search”,要改成英文双引号"Search"
  • action属性的写法不对,action="{{ request.get.q }}"会导致提交路径错误,直接留空就会提交到当前页面,或者用命名URL更规范

修正后的HTML表单

<form method="get" action="">
  <input type="search" name="q" placeholder="Search">
  <button type="submit">Search</button>
</form>

再看views.py的问题

你的视图代码有明显的语法问题和逻辑漏洞:

  • query = request.GET.get(q)里的q没有加引号,会被当成变量导致报错,应该写成request.GET.get('q')
  • 没有初始化context_dict,如果query为空的话会报错
  • 可以优化搜索逻辑,比如用模糊匹配代替精确匹配,提升用户体验
  • 缺少空查询和无结果的提示信息

修正后的views.py代码

from django.shortcuts import render
from .models import Sklep  # 确保导入你的模型

def search(request):
    context_dict = {}  # 先初始化上下文字典
    query = request.GET.get('q', '')  # 第二个参数是默认值,避免query为None

    if query.strip():  # 去掉首尾空格,避免空字符串提交
        # 用icontains做模糊搜索,不区分大小写;如果要精确匹配用miasto=query
        results = Sklep.objects.filter(miasto__icontains=query)
        context_dict['results'] = results
        
        if not results.exists():
            context_dict['message'] = "没有找到包含该关键词的地点哦~"
    else:
        # 用户未输入关键词就提交的情况
        context_dict['message'] = "请输入搜索关键词"

    return render(request, 'your_search_template.html', context_dict)

模板中渲染结果

最后在你的模板里添加结果渲染的代码,让用户能看到搜索结果或提示:

<!-- 显示提示信息 -->
{% if message %}
  <div class="search-message">{{ message }}</div>
{% endif %}

<!-- 显示搜索结果 -->
{% if results %}
  <h3>搜索结果 ({{ results|length }})</h3>
  <ul class="search-results">
    {% for sklep in results %}
      <li>{{ sklep.miasto }} - {{ sklep.nazwa }}</li>  <!-- 替换成你的模型字段 -->
    {% endfor %}
  </ul>
{% endif %}

这样你的搜索功能就能正常工作啦,既支持精确匹配也可以改成模糊匹配,还能处理各种边界情况~

内容的提问来源于stack exchange,提问作者bkoz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:00:29