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

Django中Remision编辑异常:保存生成新记录且模板加载报错

问题分析

现有创建记录功能正常,但编辑模板存在两个核心问题:

  • 保存编辑内容时会生成新记录而非更新原有记录
  • 加载编辑模板时可能因记录不存在抛出异常

当前代码的核心缺陷:

  1. editar_remision仅处理GET请求加载数据,未实现POST提交更新的逻辑
  2. 编辑表单大概率仍指向guardarremision接口,而该接口始终创建新的Remisiones实例
  3. 使用Remisiones.objects.get(pk=id)未处理记录不存在的场景,会直接抛出DoesNotExist错误
修复方案

1. 完善editar_remision视图函数

修改视图,同时支持GET(加载数据)和POST(更新数据)请求,并添加异常处理:

from django.shortcuts import get_object_or_404, render
from django.http import HttpResponse

def editar_remision(request, id):
    # 自动处理记录不存在的情况,返回404页面
    remision = get_object_or_404(Remisiones, pk=id)
    
    if request.method == 'POST':
        # 从POST中获取数据,直接更新现有实例
        remision.fecha = request.POST['fecharemi']
        remision.fecha_envio = request.POST['fechaenvio']
        remision.clientes_id = request.POST['clienteremi']
        remision.contacto = request.POST['enviadoa']
        remision.fecha_recibido = request.POST['fecharecibido']
        remision.telefono = request.POST['telefonoremi']
        remision.id_transporte_id = request.POST['formaenvio']
        remision.id_status = request.POST['statusremi']
        remision.elaborado = request.POST['preparadaremi']
        remision.guia = request.POST['guiaremi']
        
        # 调用save()更新现有记录,而非创建新记录
        remision.save()
        return HttpResponse("Remisión actualizada")
    else:
        # GET请求返回编辑页面,传递现有记录数据
        return render(request, "editar_remision.html", {'remision': remision})

2. 修改编辑表单的提交目标

确保editar_remision.html中的表单提交到当前编辑接口,并传递记录ID:

<form method="POST" action="{% url 'editar_remision' remision.id %}">
    {% csrf_token %}
    <!-- 原有表单字段,用remision的现有值填充 -->
    <input type="date" name="fecharemi" value="{{ remision.fecha|date:'Y-m-d' }}">
    <input type="text" name="clienteremi" value="{{ remision.clientes_id }}">
    <!-- 其他字段同理填充现有值 -->
    
    <button type="submit">Guardar Cambios</button>
</form>

关键说明

  • 使用get_object_or_404替代直接get,避免因记录不存在导致的服务器错误,返回友好的404页面
  • 更新现有实例时,无需重新创建Remisiones对象,直接修改已查询到的remision实例后调用save(),即可更新数据库中对应ID的记录
  • 表单必须提交到editar_remision接口,而非原来的guardarremision,后者仅负责创建新记录

内容的提问来源于stack exchange,提问作者Giovanny Garzón

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:52:11