Django中Remision编辑异常:保存生成新记录且模板加载报错
问题分析
现有创建记录功能正常,但编辑模板存在两个核心问题:
- 保存编辑内容时会生成新记录而非更新原有记录
- 加载编辑模板时可能因记录不存在抛出异常
当前代码的核心缺陷:
editar_remision仅处理GET请求加载数据,未实现POST提交更新的逻辑- 编辑表单大概率仍指向
guardarremision接口,而该接口始终创建新的Remisiones实例 - 使用
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
相关产品推荐
相关产品推荐

