Django问题:ModelForm提交后未更新对象反而创建新对象并报错
Django表单更新用户信息问题修复方案
1. 先解决get() returned more than one User_Info错误
这个问题的根源是数据库里同一个登录用户对应了多条User_Info记录,先清理冗余数据并添加约束:
- 打开终端运行Django shell:
在shell中执行清理命令(替换成你的实际app名称):python manage.py shellfrom django.contrib.auth.models import User from your_app.models import User_Info # 遍历所有用户,仅保留每个用户的第一条User_Info记录 for user in User.objects.all(): infos = User_Info.objects.filter(user=user) if len(infos) > 1: for extra_info in infos[1:]: extra_info.delete() - 给User_Info模型的
user字段添加唯一约束,避免后续重复创建:
执行迁移使约束生效:# models.py class User_Info(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, unique=True) # 你的其他字段...python manage.py makemigrations python manage.py migrate
2. 修改视图实现更新而非创建新对象
核心是在表单初始化时传入当前用户的User_Info实例,确保操作是更新而非新增:
# views.py from django.contrib.auth.decorators import login_required from django.shortcuts import render, redirect from your_app.forms import UserInfoForm from your_app.models import User_Info @login_required def edit_account(request): # 获取当前用户的User_Info,不存在则自动创建(仅首次进入编辑页时) user_info, _ = User_Info.objects.get_or_create(user=request.user) if request.method == 'POST': # 关键:传入instance参数指定要更新的对象 form = UserInfoForm(request.POST, instance=user_info) if form.is_valid(): form.save() return redirect('myaccount') # 跳转到个人信息展示页 else: # 加载编辑页时自动填充已有数据 form = UserInfoForm(instance=user_info) return render(request, 'myaccount_edit.html', {'form': form})
3. 调整前端表单(myaccount_edit.html)
确保表单使用POST方法,并且指向正确的视图URL:
<form method="post" action="{% url 'edit_account' %}"> {% csrf_token %} <!-- 可使用form.as_p快速渲染所有字段,也可手动逐个渲染 --> {{ form.as_p }} <button type="submit">保存修改</button> </form>
如果手动渲染字段,不要随意添加额外隐藏字段或修改字段name,保持与表单类定义一致。
4. 验证修复效果
提交表单后检查数据库,确认当前用户仅存在一条User_Info记录,且字段已更新而非新增对象。
内容的提问来源于stack exchange,提问作者spidey677
相关产品推荐
相关产品推荐

