Django开发Products模型CRUD时插入数据无法在网页显示
Django Products模型CRUD插入数据不展示问题排查
核心错误点
你的代码存在4个直接导致功能异常的问题:
- 请求方法判断逻辑错误:原代码写的
if request.POST == "POST":完全不成立,Django中判断POST请求必须用request.method属性,当前逻辑下所有POST请求都会直接走GET分支返回插入页,数据根本不会执行入库逻辑。 - 字段名映射不匹配:模型中商品详情字段定义为
prod_details,但你构造序列化数据时用的key是product_details,序列化器校验时会因缺少必填字段直接抛错,就算请求方法判断改对了也无法通过校验保存数据。 - 表单下拉框配置错误:分类、尺寸两个下拉框的默认提示项没有设置空值和禁用属性,用户未选择选项直接提交时会把提示文本"Open this select menu"作为字段值提交,该文本长度超过
categories字段设置的15字符上限,会直接触发校验失败;另外分类选项的value写的是1/2/3,和选项展示的分类名不一致,就算提交成功存到库里的也是数字,不是实际分类名称。 - 冗余错误:代码中
print('POST',id)、print('GET',id)引用了未定义的id变量,运行到该行会直接抛出NameError异常,这两行完全没有调试意义,可以直接删除。
修正代码
修正后的insert视图函数
def insert(request): if request.method == "POST": insert_clothes = { 'categories': request.POST.get('categories'), 'sub_categories': request.POST.get('sub_categories'), 'color': request.POST.get('color'), 'size': request.POST.get('size'), 'title': request.POST.get('title'), 'price': request.POST.get('price'), 'sku_number': request.POST.get('sku_number'), # 字段名和模型保持一致 'prod_details': request.POST.get('product_details'), 'quantity': request.POST.get('quantity') } form = POLLSerializer(data=insert_clothes) if form.is_valid(): form.save() messages.success(request, 'Record Inserted successfully!') return redirect('polls:show') else: print(form.errors) messages.error(request, f'Insert failed: {form.errors}') return render(request, 'polls/product_insert.html') return render(request, 'polls/product_insert.html')
修正后的表单下拉框部分
<!-- 分类下拉框:默认项设为空值+禁用+必填,value和展示文本一致 --> <select class="form-select" name="categories" required> <option selected value="" disabled>Open this select menu</option> <option value="9-6 WEAR">9-6 WEAR</option> <option value="DESI SWAG">DESI SWAG</option> <option value="FUSION WEAR">FUSION WEAR</option> <option value="BRIDAL WEAR">BRIDAL WEAR</option> </select> <!-- 尺寸下拉框:默认项设为空值+禁用+必填 --> <select class="form-select" name="size" required> <option selected value="" disabled>Open this select menu</option> <option value="SM">SM</option> <option value="M">M</option> <option value="L">L</option> <option value="XL">XL</option> <option value="XXL">XXL</option> <option value="XXXL">XXXL</option> </select>
验证步骤
- 完成上述修改后重启Django服务
- 访问插入页面,选择分类、尺寸,填写所有字段后提交
- 若控制台打印序列化器错误,根据错误提示调整对应字段配置
- 提交成功后会自动跳转到展示页,即可看到新插入的商品数据
- 若仍未展示,可登录Django admin后台查看Products表,确认数据是否实际入库
内容的提问来源于stack exchange,提问作者Ameya Potdar
相关产品推荐
相关产品推荐

