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

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">&times;</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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:12:49