Django同一应用ListView与EditView关联问题:潜客转客户未删除
问题分析
你遇到的核心问题是编辑视图的逻辑顺序错误:在删除Prospecto记录后,又执行了form.save(),而表单绑定的仍是内存中的Prospecto对象,这会重新创建一条新的Prospecto记录,导致删除操作看起来无效。另外,在ListView的get_queryset里处理POST删除请求是不符合Django视图职责划分的——ListView默认只处理GET请求,不该在这里做数据删除操作。
解决方案
1. 修复ProspectoEditar视图的逻辑
调整代码顺序,当勾选es_cliente完成客户转换和删除后,直接跳转页面,避免后续的form.save()执行:
def ProspectoEditar(request, pk): prospecto = get_object_or_404(Prospecto, pk=pk) if request.method == 'POST': form = ProspectoForm(request.POST, instance=prospecto) if 'es_cliente' in request.POST: # 创建Cliente记录 cliente = Cliente(nombre=prospecto.nombre) cliente.save() # 删除Prospecto记录 prospecto.delete() # 直接跳转,跳过后续表单保存逻辑 return redirect('prospectos:prospectos_list') # 未勾选复选框时,正常保存表单 if form.is_valid(): form.save() return redirect('prospectos:prospectos_list') else: form = ProspectoForm(instance=prospecto) return render(request, 'prospectos-editar.html', {'form': form})
2. 移除ListView中错误的POST处理逻辑
把ProspectoListView里处理POST删除的代码全部删掉,恢复原本的列表查询逻辑:
class ProspectoListView(ListView): model = Prospecto template_name = 'prospectos.html' context_object_name = 'prospectos' def get_queryset(self): queryset = super().get_queryset() fecha_inicio = self.request.GET.get('fecha_inicio') fecha_fin = self.request.GET.get('fecha_fin') if fecha_inicio and fecha_fin: queryset = queryset.filter(fecha__range=[fecha_inicio, fecha_fin]) elif fecha_inicio: queryset = queryset.filter(fecha__gte=fecha_inicio) elif fecha_fin: queryset = queryset.filter(fecha__lte=fecha_fin) return queryset
额外优化建议
如果你的业务逻辑是转为客户后彻底删除潜在客户记录,那么Prospecto模型中的es_cliente字段其实是多余的,可以考虑移除该字段,减少数据冗余。
内容的提问来源于stack exchange,提问作者Itzel Bracho Molina
相关产品推荐
相关产品推荐

