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
相关产品推荐
相关产品推荐

