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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:33:13