Django使用Modal删除记录时参数传递错误问题求助
Django Modal删除记录参数缺失问题解决
作为Django新手,我想实现用Modal弹窗删除记录,但Modal表单出现参数缺失错误,不知道如何添加正确参数。以下是我的相关代码:
HTML列表代码
<table id="tablaAlmacenes" class="table table-bordered table-striped"> <thead> <tr> <th>Almacén</th> <th>Detalles</th> <th></th> </tr> </thead> <tbody> {% for almacen in object_list %} <tr> <td>{{ almacen.almacen }}</td> <td>{{ almacen.descripcion }}</td> <td> <div> <a href="" class="btn btn-link text-info">Detalles</a> <a href="" class="btn btn-link text-primary">Editar</a> <a class="btn btn-link deleteAlmacen" data-id="{{ almacen.id}}"><span class="fas fa-trash text-danger"></a> </div> </td> </tr> {% endfor %} </tbody> <tfoot> <tr> <th>Almacén</th> <th>Detalles</th> <th></th> </tr> </tfoot> </table>
urls.py代码
urlpatterns = [ path('',include('polls.urls'),name='home'), path('admin/', admin.site.urls), # path('contact/',views.contact, name='contacto') path('almacenes/', AlmacenesListView.as_view(), name='almacenes'), path('almacenes/nuevo', AlmacenesCreateView.as_view(), name='crear_almacen'), path('almacenes/<int:id>/remove/', AlmacenesDeleteView.as_view(), name='eliminar_almacen') ]
views.py代码
class AlmacenesListView(ListView): model = Almacen template_name = 'pages/index.html' success_message = "Bien!!!!" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['title'] = "Lista de Almacenes" print(reverse_lazy('almacenes')) return context class AlmacenesCreateView(SuccessMessageMixin, CreateView): model = Almacen form_class = AlmacenesForm success_url = reverse_lazy('almacenes') success_message = "Bien!!!!" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) return context class AlmacenesDeleteView(DeleteView): model = Almacen success_url = reverse_lazy('almacenes')
Modal代码
<div class="modal fade" aria-modal="false" id="deleteAlmacenModal"> <div class="modal-dialog modal-dialog-centered modal-sm"> <div class="modal-content"> <div class="modal-header"> <h4 class="modal-title">Confirmación</h4> <button type="button" class="close" data-dismiss="modal" aria-label="Cerrar"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <p>¿Desea eliminar el Almacen?</p> </div> <div class="modal-footer justify-content-between"> <button type="button" class="btn btn-default" data-dismiss="modal">Cerrar</button> <form action="{% url 'eliminar_almacen' (some parameter here but error) %}" method="POST"> {% csrf_token %} <input type="hidden" name="id" id="almacen_id"/> <button type="submit" class="btn btn-danger">Eliminar</button> </form> </div> </div> <!-- /.modal-content --> </div> <!-- /.modal-dialog --> </div>
Modal脚本代码
$(document).on('click','.deleteAlmacen',function(){ var id_almacen=$(this).attr('data-id'); $('#almacen_id').val(id_almacen); $('#deleteAlmacenModal').modal('show'); });
解决方案
1. 动态设置Modal表单的Action地址
Modal是共用弹窗,无法在模板初始化时直接生成对应id的删除URL,需通过JavaScript动态修改表单的action属性:
- 修改Modal中的表单,移除硬编码的
action并添加id:
<form id="deleteForm" method="POST"> {% csrf_token %} <input type="hidden" name="id" id="almacen_id"/> <button type="submit" class="btn btn-danger">Eliminar</button> </form>
- 更新JavaScript脚本,在弹窗显示前设置正确的删除URL:
$(document).on('click','.deleteAlmacen',function(){ var id_almacen=$(this).attr('data-id'); // 生成对应id的删除URL,替换占位的0为实际id var deleteUrl = "{% url 'eliminar_almacen' 0 %}".replace('0', id_almacen); $('#deleteForm').attr('action', deleteUrl); $('#almacen_id').val(id_almacen); $('#deleteAlmacenModal').modal('show'); });
2. 修正DeleteView的参数匹配
Django的DeleteView默认使用pk作为URL参数名,但你的urls.py中用的是id,需在视图中指定参数名,否则视图无法找到要删除的对象:
更新AlmacenesDeleteView:
class AlmacenesDeleteView(DeleteView): model = Almacen success_url = reverse_lazy('almacenes') pk_url_kwarg = 'id' # 指定URL中的参数名为id
3. 修复HTML标签错误
删除按钮的<span>标签未闭合,修正后:
<a class="btn btn-link deleteAlmacen" data-id="{{ almacen.id}}"> <span class="fas fa-trash text-danger"></span> </a>
内容的提问来源于stack exchange,提问作者Roberto Vargas
相关产品推荐
相关产品推荐

