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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 12:15:01