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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:55:31