Django执行更新操作未修改原有数据反而新建对象问题求助
根因分析
Django 中 ModelForm 执行保存操作的逻辑由实例化时传入的参数决定:
- 仅传入表单数据时,
save()会执行新增逻辑,创建新的模型实例写入数据库 - 同时传入
instance参数绑定原有模型对象时,save()才会执行更新逻辑,修改传入的实例数据
你当前的视图代码仅在 GET 请求初始化表单时绑定了原有产品实例,POST 请求处理阶段的表单实例没有绑定原有对象,因此提交后会生成新的产品记录。
修复代码
仅需修改视图函数中 POST 请求下的表单实例化逻辑,补充 instance 参数即可,修改后完整视图代码如下:
@login_required(login_url='login') def editProduct(request, id): # 可替换为 get_object_or_404(Products, id=id) 避免id不存在时报服务器错误 product = Products.objects.get(id=id) if request.method == 'POST': # 新增instance参数绑定要修改的原有产品对象 form = ProductForm(request.POST, request.FILES, instance=product) if form.is_valid(): form.save() messages.success(request, '产品修改成功') return redirect('index') else: form = ProductForm(instance=product) context = { 'form': form } return render(request, 'store/edit-product.html', context)
可选优化
模板中提交按钮的文本可改为「修改产品」更贴合编辑场景,不影响现有功能运行。
内容的提问来源于stack exchange,提问作者HassanDh
相关产品推荐
相关产品推荐

