如何在Django中使用JavaScript实现Oracle数据库用户信息更新功能
问题根因与修复方案
核心问题点
- JS回填逻辑错误:遍历表格单元格时重复给所有表单字段赋值,导致字段值被覆盖、id拼写错误、只读属性设置无效
- 表单无操作标识:两个提交按钮未加区分标识,后端无法判断是新增还是修改请求
- 视图层逻辑缺失:仅实现了新增逻辑,没有适配修改请求的分支,修改执行函数为空且拼写错误
- 数据库层逻辑缺失:缺少Oracle侧的更新存储过程/更新语句实现
修复步骤
1. 修正模板表单
给两个提交按钮增加name属性,用于后端区分操作类型:
<input name="operacion" class="botons" type="submit" value="Agregar" onclick="limpiarFormulario()" > <input name="operacion" class="botons" type="submit" value="Modificar" >
2. 修复JS回填逻辑
替换原有btnModificar的点击事件代码,按单元格索引精准赋值:
$(".btnModificar").click(function(){ const currentTr = $(this).closest('tr'); // 按表格列顺序对应赋值到表单,设置run为只读避免修改 $("#run").val(currentTr.find('td:eq(0)').text()).prop('readonly', true); $("#nombre").val(currentTr.find('td:eq(1)').text()); $("#a_paterno").val(currentTr.find('td:eq(2)').text()); $("#a_materno").val(currentTr.find('td:eq(3)').text()); $("#correo").val(currentTr.find('td:eq(4)').text()); $("#telefono").val(currentTr.find('td:eq(5)').text()); });
3. 修正视图层逻辑
首先修改registro_coach函数,增加操作类型判断分支:
def registro_coach(request): p_coach = 'SP_LISTA_COACH' data ={ 'coachs' : listar(p_coach) } if request.POST: operacion = request.POST.get('operacion') run = request.POST.get('run') nombre = request.POST.get('nombre') ap_paterno = request.POST.get('a_paterno') ap_materno = request.POST.get('a_materno') telefono = request.POST.get('telefono') correo = request.POST.get('correo') if operacion == 'Agregar': # 原有新增逻辑保留 contrasena = run[:4] contrato = '1' salida = agregar_coach(run,nombre,ap_paterno,ap_materno,telefono,correo,contrasena,contrato) if salida == 1: data['mensaje'] = 'agregado correctamente' else: data['mensaje'] = 'no se ha podido agregar' elif operacion == 'Modificar': # 新增修改逻辑分支 salida = modificar_coach(run,nombre,ap_paterno,ap_materno,telefono,correo) if salida == 1: data['mensaje'] = 'modificado correctamente' else: data['mensaje'] = 'no se ha podido modificar' # 操作完成后刷新教练列表 data['coachs'] = listar(p_coach) return render(request, 'core/registro_coach.html', data)
然后修正修改函数的拼写,补充Oracle调用逻辑:
def modificar_coach(run, nombre, ap_paterno, ap_materno, telefono, correo): # 此处替换为你实际的Oracle更新逻辑,调用更新存储过程或直接执行UPDATE语句 # 示例:调用存储过程SP_MODIFICAR_COACH,以run为唯一过滤条件更新对应教练的其他字段 # 执行成功返回1,失败返回0 pass
4. 补充Oracle侧逻辑
提前编写好更新教练信息的存储过程,逻辑示例:
CREATE OR REPLACE PROCEDURE SP_MODIFICAR_COACH( p_run IN VARCHAR2, p_nombre IN VARCHAR2, p_ap_paterno IN VARCHAR2, p_ap_materno IN VARCHAR2, p_telefono IN VARCHAR2, p_correo IN VARCHAR2, p_salida OUT NUMBER ) AS BEGIN UPDATE coach SET nombre = p_nombre, ap_paterno = p_ap_paterno, ap_materno = p_ap_materno, telefono = p_telefono, correo = p_correo WHERE run = p_run; p_salida := 1; EXCEPTION WHEN OTHERS THEN p_salida := 0; END;
内容的提问来源于stack exchange,提问作者JonaBeyer
相关产品推荐
相关产品推荐

