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

使用HTML select选中值查询Django Models返回空QuerySet如何解决

问题原因
  • 前端<option>标签的value属性为空:表单提交时,<select>组件会将选中项对应的option的value值作为参数传给后端,你当前代码中value设置为空字符串,因此request.POST['select_project']实际拿到的是空值,按空值查询自然返回空QuerySet。
  • 多余的属性设置:<option>标签不需要额外定义name属性,name仅需在<select>标签上声明一次,多余的属性可能引发提交异常。
  • 视图逻辑缺失:你当前的视图仅处理了POST请求,未处理首次GET访问的逻辑,没有将项目列表projects传递给模板,会导致下拉框本身就没有可选选项。
修复方案

前端模板修复

补充option的value值为项目标题,删除多余的name属性:

<select class="select_project" name="select_project">
    {% for project in projects %}
    <option value="{{ project.title }}">{{ project.title }}</option>
    {% endfor %}
</select>

如果存在项目标题重复的可能,更推荐用主键ID作为value,查询准确率更高:

<option value="{{ project.id }}">{{ project.title }}</option>

注意:外层表单需要添加method="post"属性和{% csrf_token %}标签,否则会触发Django的CSRF校验报错,导致提交失败。

后端视图修复

补全GET请求的项目列表传递逻辑,同时增加参数校验避免空查询:

按标题查询的修复版

def overview(request):
    # 全量项目列表用于渲染下拉框,GET/POST请求都需要传递
    projects = Project.objects.all()
    displayed_project = None
    if request.method == 'POST':
        selected_project = request.POST.get('select_project', '')
        if selected_project:
            displayed_project = Project.objects.filter(title=selected_project)
    return render(request, 'core/overview.html', {
        'projects': projects,
        'displayed_project': displayed_project
    })

按ID查询的优化版(更稳定)

def overview(request):
    projects = Project.objects.all()
    displayed_project = None
    if request.method == 'POST':
        selected_project_id = request.POST.get('select_project', '')
        if selected_project_id.isdigit():
            displayed_project = Project.objects.filter(id=selected_project_id)
    return render(request, 'core/overview.html', {
        'projects': projects,
        'displayed_project': displayed_project
    })

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:42:02