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

Django问题:ModelForm提交后未更新对象反而创建新对象并报错

Django表单更新用户信息问题修复方案

1. 先解决get() returned more than one User_Info错误

这个问题的根源是数据库里同一个登录用户对应了多条User_Info记录,先清理冗余数据并添加约束:

  • 打开终端运行Django shell:
    python manage.py shell
    
    在shell中执行清理命令(替换成你的实际app名称):
    from 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 04:16:16