Django中数据更新时重复创建对象而非覆盖问题求助
解决Django更新数据时重复创建对象的问题
问题根源
你当前的代码在POST请求里直接新建了EmailDb实例sdata,调用save()自然会生成新的数据库记录,而非更新已有的pi对象。另外用update()方法时,Django的批量更新不会处理FileField的文件存储逻辑,导致上传的文件无法正确保存,所以出现文件无法显示的问题。
修复方案
直接修改已通过pk获取的pi对象,更新字段后再调用save(),同时处理文件上传的边界情况(比如用户没上传新文件时保留原文件):
修改后的views.py代码:
def EuAdmin(request, pk): pi = EmailDb.objects.get(id=pk) if request.method == 'POST': # 更新普通字段 pi.institution = request.POST.get('institution', '') pi.fullname = request.POST.get('fullname', '') pi.email = request.POST.get('email', '') # 处理IntegerField,将POST字符串转为整数 contact = request.POST.get('contact', '') if contact: pi.contact = int(contact) pi.position = request.POST.get('position', '') # 处理文件上传:仅当有新文件时才更新 uploadd = request.FILES.get('upload') if uploadd: pi.uploaddata = uploadd # 保存原对象,而非新建 pi.save() return HttpResponseRedirect("/eadmin") return render(request, 'NEC/eupdate.html', {'pi': pi})
关键说明
- 直接操作从数据库获取的
pi对象,修改字段后调用save(),会触发Django完整的模型保存逻辑,既更新原记录,也能正确处理FileField的文件存储。 - 对
contact字段增加非空判断再转整数,避免空字符串转整数报错。 - 文件上传部分加了判断,用户没上传新文件时,不会覆盖原有的
uploaddata值。
内容的提问来源于stack exchange,提问作者AMRIT SHAHI
相关产品推荐
相关产品推荐

