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

Django如何根据用户搜索的reception号、part号展示对应表格数据

问题根因

你的搜索功能失效核心是前后端参数名不匹配:

  • 前端搜索输入框的name属性为search,但后端视图中尝试从GET参数获取的是reception和partno,永远拿不到用户输入的搜索内容,导致过滤逻辑始终不触发,直接返回全量数据。
  • 原有过滤逻辑存在逻辑运算符使用不符合需求、空结果 fallback 不合理的问题。

解决方案

方案1:单搜索框同时匹配两个字段(无需修改前端布局)

如果你只用一个搜索框,输入内容同时模糊匹配reception number和part number,修改如下:

1. 修改views.py代码

@login_required(login_url='login')
def gallery(request):
    # 读取前端传入的name为search的搜索参数
    search_keyword = request.GET.get('search', '').strip()
    if search_keyword:
        # 关键词同时匹配两个字段,使用逻辑或
        allusername = Photo.objects.filter(
            Q(reception__icontains=search_keyword) | Q(partno__icontains=search_keyword)
        ).order_by("-Datetime")
    else:
        # 无搜索关键词返回全量数据
        allusername = Photo.objects.all().order_by("-Datetime")
    context = {'allusername': allusername, 'search_keyword': search_keyword}
    return render(request, 'photos/gallery.html', context)

2. 可选优化前端:搜索后保留输入框内容

修改表单的input标签,增加value属性回显已搜索的内容:

<input class="form-control mr-sm-2" type="search" placeholder="Search" aria-label="Search" name="search" value="{{ search_keyword }}">

方案2:双搜索框分别匹配两个字段(符合最初的设计需求)

如果你要支持分别输入reception number和part number检索,可单独搜索其中一个字段,也可同时输入两个字段做组合过滤,修改如下:

1. 修改gallery.html的表单部分

<form class="form-inline my-2 my-lg-0" action="{% url 'gallery' %}">
  <input class="form-control mr-sm-2" type="search" placeholder="Reception Number" name="reception" value="{{ search_reception }}">
  <input class="form-control mr-sm-2" type="search" placeholder="Part Number" name="partno" value="{{ search_partno }}">
  <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>

2. 修改views.py代码

@login_required(login_url='login')
def gallery(request):
    search_reception = request.GET.get('reception', '').strip()
    search_partno = request.GET.get('partno', '').strip()
    allusername = Photo.objects.all().order_by("-Datetime")
    # 动态拼接过滤条件
    filters = Q()
    if search_reception:
        filters &= Q(reception__icontains=search_reception)
    if search_partno:
        filters &= Q(partno__icontains=search_partno)
    if filters:
        allusername = allusername.filter(filters)
    context = {
        'allusername': allusername,
        'search_reception': search_reception,
        'search_partno': search_partno
    }
    return render(request, 'photos/gallery.html', context)

可选优化:搜索无结果时提示

在表格上方增加无结果提示,避免用户误以为功能失效:

<!-- 单搜索框方案用这个 -->
{% if search_keyword and not allusername %}
<p style="color: #dc3545;">没有找到匹配「{{ search_keyword }}」的记录</p>
{% endif %}

<!-- 双搜索框方案用这个 -->
{% if (search_reception or search_partno) and not allusername %}
<p style="color: #dc3545;">没有找到匹配当前搜索条件的记录</p>
{% endif %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:45:03