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

Django编辑用户详情时新增数据而非更新的问题求助

问题原因

编辑提交表单后新增记录的核心问题是:详情模板里的表单action被硬编码为/details/,不管是在创建页面还是编辑页面,提交表单都会请求创建用户详情的details视图,而非处理更新的updatedetails视图,导致每次编辑提交都触发新建逻辑。

另外,创建视图未校验用户是否已有详情记录,可能出现同一用户多条重复记录的情况。

解决方案
  1. 让表单动态提交到当前页面URL(创建页提交到创建视图,编辑页提交到更新视图)
  2. 优化创建视图,避免同一用户重复创建详情记录(可选但推荐)
具体代码修改

1. 修改详情模板 details.html

移除表单的硬编码action,让表单提交到当前访问的URL:

<!-- 原代码 -->
<form action="/details/" method="POST">

<!-- 修改后 -->
<form method="POST">

或者更严谨地根据表单实例动态生成action:

<form action="{% if form.instance.pk %}{% url 'updatedetails' form.instance.pk %}{% else %}{% url 'details' %}{% endif %}" method="POST">

2. 优化创建视图 views.py

在创建视图中先检查用户是否已有详情记录,若有则直接跳转至编辑页面,避免重复创建:

@login_required(login_url="signin")
def details(request):
    # 检查当前用户是否已存在详情记录
    try:
        existing_detail = Detail.objects.get(username=request.user)
        return redirect('updatedetails', pk=existing_detail.pk)
    except Detail.DoesNotExist:
        pass

    if request.method == "POST":
        form = Details(request.POST)
        if form.is_valid():
            detail = form.save(commit=False)
            detail.username = request.user
            detail.save()
            return redirect(success, pk=detail.pk)
    else:
        form = Details(initial={"matricno":request.user.username})
    return render(request, "details.html", {"form":form})

3. (可选)优化模型字段命名

将Detail模型中的外键字段username改为user,避免语义混淆:

# models.py
class Detail(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)  # 移除null=True和default="",登录用户必有对应User对象
    matricno = models.CharField(max_length=9, default="")
    email = models.EmailField(default="")
    first_name = models.CharField(max_length=200, default="")
    last_name = models.CharField(max_length=255, default="")

    class Meta:
        verbose_name_plural = "Details"  # 复数形式更规范

    def __str__(self):
        return f"{self.first_name} {self.last_name}"

同时更新视图中对应的代码:

# 检查记录时
existing_detail = Detail.objects.get(user=request.user)
# 保存时
detail.user = request.user

修改完成后,编辑提交会正确触发更新视图,修改原有记录而非创建新条目,同时也避免了同一用户多条重复详情的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:05:20