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

Django中UserAccount数据无法更新的问题求助

问题诊断与解决

核心问题

你的UserAccount模型自定义的save方法存在逻辑错误:当更新已有用户(对象已存在,即self.pk不为空)时,方法没有调用父类的save()方法,导致修改后的对象根本没有写入数据库。

看原代码中的save方法:

def save(self, *args, **kwargs):
    if not self.pk:
        self.role = self.base_role
        return super().save(*args, **kwargs)

这段代码只在新建用户(无pk)时执行保存逻辑,当更新用户时,if not self.pk不成立,方法直接结束,完全没有触发数据库更新操作。这就是为什么内存中的对象显示已修改,但数据库毫无变化的原因。

修复步骤

1. 修正模型的save方法

调整save方法的逻辑,确保无论是新建还是更新用户,都能调用父类的save()完成数据库写入:

def save(self, *args, **kwargs):
    if not self.pk:
        self.role = self.base_role
    # 将父类save调用移到if块外,确保所有场景都执行保存
    return super().save(*args, **kwargs)

这样新建用户时会自动设置默认角色,更新用户时直接执行标准的保存流程,数据就能正常同步到数据库。

2. 优化视图代码(可选但推荐)

你的视图中手动从表单提取数据赋值给对象的操作完全冗余,ModelForm本身已经封装了更新逻辑,直接调用edit_user_form.save()即可简化代码:

def edit_ni_user(request , user_id):
    request_user = get_object_or_404(UserAccount,id=user_id)
    if request.method == "POST":
        edit_user_form = EditUserForm(request.POST, request.FILES, instance=request_user)
        if edit_user_form.is_valid():
            print("edit_user_form is valid")
            # 直接调用form的save方法完成更新,无需手动赋值
            edit_user_form.save()
            messages.success(request, f" {request_user}  Edited Successfully")
            return redirect('index')
        else:
            for field, errors in edit_user_form.errors.items():
                for error in errors:
                     messages.error(request, f'{field}: {error}')
    else:
        edit_user_form = EditUserForm(instance=request_user)
    # 补充原视图缺失的模板返回逻辑
    return render(request, 'your_edit_template.html', {'form': edit_user_form})

注意:原视图代码缺少返回模板的render语句,需要补充完整,否则会抛出异常。

验证效果

修复后重新测试更新操作:

  • 提交表单后,数据库中的用户数据会正常同步修改
  • 控制台打印的用户对象将与数据库中的数据一致

内容的提问来源于stack exchange,提问作者AmdDwg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:35:33