Django技术问题:编辑SQLite数据提交后新增行而非更新,求解决
问题分析与修复方案
你的代码存在三个核心问题,导致编辑后创建新数据而非更新,且跳转异常:
1. 表单提交目标错误
当前表单的action="/viewdb/"会把POST请求发送到ViewDBData函数,但该函数并没有处理更新逻辑,反而可能触发了数据创建的逻辑(推测你有其他处理POST的视图绑定到了同一路由)。表单应该提交到负责编辑的EditData路由,而非数据展示路由。
2. 编辑视图的逻辑缺陷
EditData在处理完POST更新后,没有重定向到展示页,而是重新渲染编辑页,不符合POST-REDIRECT-GET规范,容易导致重复提交。- 初始化表单时没有绑定要编辑的实例,手动传递
nameupdate的方式不规范,且无法利用Django表单的默认值填充功能。
3. 数据展示视图的重定向错误
ViewDBData中直接返回HttpResponseRedirect('/viewdb/')会导致无限重定向,该视图应该负责渲染展示页面并传递数据。
具体修复代码
1. 修复view.py
from django.shortcuts import render, redirect, get_object_or_404 from .forms import DjangoForm # 确保导入你的表单 from .models import FormDB def EditData(request, id): # 获取要编辑的实例,不存在则返回404 obj = get_object_or_404(FormDB, id=id) # GET请求时,用实例初始化表单,自动填充当前值 form = DjangoForm(request.POST or None, instance=obj) if request.method == "POST" and form.is_valid(): # 直接保存表单,无需手动修改字段 form.save() # 更新完成后重定向到展示页,避免重复提交 return redirect('viewdb') # GET请求或表单验证失败时,渲染编辑页 return render(request, "editform.html", {'form': form}) def ViewDBData(request): # 获取所有数据,传递给模板展示 editeddb = FormDB.objects.all() # 渲染展示模板(假设模板名为viewdb.html) return render(request, "viewdb.html", {'editeddb': editeddb})
2. 修复editform.html
<body> <h1>EDIT PAGE</h1> <!-- 使用{% url %}标签指向编辑路由,避免硬编码 --> <form action="{% url 'edit_data' id=form.instance.id %}" method="POST"> {% csrf_token %} <label>Enter new name: </label> <!-- 利用表单渲染输入框,或手动设置value为当前值 --> {{ form.name }} <input type="submit" value="Submit Changes"><br> </form> </body>
如果你不想用表单自动渲染,也可以手动写输入框:
<input type="text" name="name" value="{{ form.instance.name }}" REQUIRED>
3. 修复urls.py
确保编辑路由带参数,且命名方便模板调用:
from django.urls import path from . import views urlpatterns = [ # 编辑路由,命名为edit_data,方便模板调用 path('edit/<int:id>/', views.EditData, name='edit_data'), # 展示路由,命名为viewdb path('viewdb/', views.ViewDBData, name='viewdb'), # 其他路由... ]
关键说明
- 使用
get_object_or_404替代objects.get(),避免因数据不存在抛出500错误。 - 绑定表单实例
instance=obj是Django编辑数据的标准方式,表单会自动填充当前值,保存时直接更新对应实例。 - POST处理完成后用
redirect重定向,遵循POST-REDIRECT-GET规范,防止重复提交和浏览器刷新导致的重复操作。 - 模板中用
{% url %}生成路由,避免硬编码路径,提升代码可维护性。
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

