Django ModelForm编辑时不更新实例反而新建记录问题求助
问题原因及解决方案
编辑时创建新记录的核心原因是:Django ModelForm 只有在初始化时传入instance参数才会执行更新逻辑,否则默认执行新建逻辑。你当前的medical_edit视图中,仅在GET请求构造表单时传入了要编辑的issue实例,POST请求处理分支没有传这个参数,所以表单每次提交都当成新记录保存。
此外你重写的save方法属于冗余逻辑,ModelForm本身就会自动将cleaned_data中的合法字段值赋值给绑定的模型实例,不需要手动重复赋值,直接删除这部分重写代码即可。
修复步骤
1. 修改medical_edit视图的POST分支,添加instance参数
def medical_edit(request,id_issue): worker=Worker.objects.get(user_id=request.user) issues=Medical_Issue.objects.filter(worker=worker).order_by('-created_at') issue= Medical_Issue.objects.get(id=id_issue) if request.method == 'GET': form = Medical(user_id=worker.user_id,instance=issue, method= 'EDIT') else: # 新增instance=issue参数,告知表单需要更新现有实例 form = Medical(request.POST, request.FILES, user_id=worker.user_id, instance=issue, method= 'EDIT') if form.is_valid(): form.save() return redirect('medical_list') return render(request,'medical_add.html', {'method':'EDIT','form': form})
2. (可选优化)删除Medical表单中冗余的save方法
直接删除以下代码即可,不影响功能还能减少冗余逻辑:
def save(self, commit=True): m = super(Medical, self).save(commit=False) m.worker=self.cleaned_data['worker'] m.description=self.cleaned_data['description'] m.upload=self.cleaned_data['upload'] if commit: m.save() return m
内容的提问来源于stack exchange,提问作者user11319165
相关产品推荐
相关产品推荐

