Django DeleteView如何传递参数用于构造success_url?
问题根因与修正方案
1. get_success_url 参数获取与传参逻辑错误
你在调用reverse_lazy时犯了两个错误:
- 不能直接通过
self.company/self.worker取关联值,self是视图类实例,要先获取当前待删除的Part对象(即self.object),再通过该对象取关联的外键值 - 传字典形式的命名参数时应该用
kwargs参数,不是args(args用于传位置参数列表)
修正后的视图代码:
class PartDeleteView(DeleteView): model = Part def get_success_url(self): # self.object 就是当前要删除的Part实例 return reverse_lazy('listparts', kwargs={ 'company_pk': self.object.company.pk, 'worker_pk': self.object.worker.pk })
2. 表单未指定提交方法导致删除逻辑不触发
你的删除确认页表单没有加method="post",浏览器默认会用GET请求提交,而Django的DeleteView仅会处理POST请求的删除逻辑,GET请求仅会渲染确认页,所以出现跳转但不删除的问题。
修正后的表单代码:
<div class="row"> <div class="col-md-3"> <!-- 增加method="post" 指定提交方式 --> <form class="form-group" method="post"> {% csrf_token %}{{ form|crispy }} <div class="form-group"> <p>Are you sure you want to delete "{{ object }}"?</p> <!-- 按钮文本可根据需求调整,不影响功能 --> <input type="submit" class="btn btn-primary mt-2 mb-2" value="删除"> </div> </form> </div> </div>
可选优化:列表页跳转链接参数修正
你当前列表页的删除链接写法如果上下文没有单独定义part_pk变量,需要改成取Part实例的pk:
<a href="{% url 'deletepart' part.pk %}">Delete this part</a>
内容的提问来源于stack exchange,提问作者Doug Smith
相关产品推荐
相关产品推荐

