如何将HTML表单输入值传递至Django视图完成数据库模型查询
Django表单传参查询数据库实现方案
你现有代码有两处核心问题,按以下步骤修正即可:
1. 修正HTML表单代码
你原代码里method属性拼写错误(写成了metohd),同时补充必要的属性避免兼容问题:
<!-- 替换你原有的form代码,把action里的视图名换成你urls.py里配置的from_DB视图的name值 --> <form method="GET" id="figure_choice_form" action="{% url 'from_DB' %}"> <label for="figure_id">Enter ID</label> <input type="text" id="figure_id" name="figure_id" required> <button type="submit">Submit</button> </form>
如果你暂时没给路由配name,也可以直接写路由路径,比如
action="/get-figure/",和你urls.py里的路径保持一致即可。
2. 修正视图层参数提取与查询逻辑
GET请求提交的所有表单参数都存储在request.GET字典对象中,不能直接把request对象传给ORM查询,同时要加参数合法性校验避免报错:
from django.shortcuts import render, get_object_or_404 from .models import Figure def from_DB(request): # 从GET参数中取name为figure_id的值,取不到默认返回None figure_id = request.GET.get('figure_id') figures_list = [] # 校验参数:必须有值、且为数字(因为数据库id是整数类型) if figure_id and figure_id.isdigit(): # 过滤查询匹配的记录 figures_list = Figure.objects.filter(id=figure_id) # 如果你确定一个ID只对应一条记录,也可以用下面这行直接拿单条,匹配不到自动返回404页面 # figure = get_object_or_404(Figure, id=figure_id) # context = {"figure": figure} context = { "figures_list": figures_list, "query_id": figure_id } return render(request, "app1/data_from_DB.html", context)
3. 模板层展示查询结果
在app1/data_from_DB.html里按需渲染结果,处理空查询、无匹配结果的场景:
<div> {% if figures_list %} <h3>查询结果</h3> <ul> {% for figure in figures_list %} <li> *ID:{{ figure.id }}* <br>名称:{{ figure.figure_name }} <!-- 其他字段替换成你Figure模型里定义的实际字段名即可 --> </li> {% endfor %} </ul> {% elif query_id %} <p>未找到ID为 *{{ query_id }}* 对应的figure信息</p> {% else %} <p>请输入ID后提交查询</p> {% endif %} </div>
补充说明
- 你当前用GET方法提交查询请求是合理的,查询类请求适合用GET,参数会拼接在URL上,方便分享查询结果。如果后续改成POST提交,记得在form标签内加
{% csrf_token %}标签,否则Django会报403跨站请求伪造错误。 - 不要直接把用户输入的内容传给ORM查询,必须做类型校验,否则用户输入非数字内容时,ORM会抛出字段类型不匹配的异常。
- 如果ID是模型主键,用
get_object_or_404比filter更适合单条查询场景,不用自己处理查询结果为空的逻辑。
内容的提问来源于stack exchange,提问作者logan_9997
相关产品推荐
相关产品推荐

