Django编辑用户详情时新增数据而非更新的问题求助
问题原因
编辑提交表单后新增记录的核心问题是:详情模板里的表单action被硬编码为/details/,不管是在创建页面还是编辑页面,提交表单都会请求创建用户详情的details视图,而非处理更新的updatedetails视图,导致每次编辑提交都触发新建逻辑。
另外,创建视图未校验用户是否已有详情记录,可能出现同一用户多条重复记录的情况。
解决方案
- 让表单动态提交到当前页面URL(创建页提交到创建视图,编辑页提交到更新视图)
- 优化创建视图,避免同一用户重复创建详情记录(可选但推荐)
具体代码修改
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
相关产品推荐
相关产品推荐

