Django DeleteView仅第二次尝试才生效问题求助
Django DeleteView首次删除不生效问题排查与解决
问题分析
你遇到的问题核心在于MetricDeleteView的两处不合理配置,导致首次删除请求未正确执行对象删除操作:
- 错误指定
form_class:DeleteView默认使用专门的确认表单(仅需CSRF令牌),无需指定更新表单MetricUpdateForm。额外指定更新表单可能干扰视图的默认处理流程,比如表单验证逻辑意外拦截或延迟了删除操作。 cached_property的不当使用:dashboard_score通过@cached_property缓存对象关联数据,但在DeleteView的生命周期中,缓存可能导致获取对象的时机出现偏差,间接影响删除逻辑的执行。
修复步骤
1. 移除多余的form_class配置
删除form_class = MetricUpdateForm这一行,让DeleteView使用默认的确认表单:
class MetricDeleteView(DeleteView): template_name = "dashboard/administration/metric/delete.html" button_title = "Update metric" # 移除form_class配置 model = dashboard_metric # ... 其他代码后续调整
2. 替换cached_property为直接获取逻辑
取消dashboard_score的缓存装饰器,直接在get_success_url中获取关联数据,避免缓存带来的潜在问题:
class MetricDeleteView(DeleteView): template_name = "dashboard/administration/metric/delete.html" button_title = "Update metric" model = dashboard_metric def get_success_url(self): # 直接获取对象关联的score,无需缓存 score = self.get_object().score return reverse_lazy("administration:dashboard:update_score", kwargs={ 'dashboard': score.dashboard.id, 'pk': score.id })
3. 额外排查点
如果以上修改后问题仍存在,可检查以下内容:
- 模型
dashboard_metric是否有自定义的delete()方法,是否存在逻辑错误导致删除延迟 - 是否有
pre_delete/post_delete信号接收器,干扰了删除操作的执行 - 数据库事务配置是否合理,是否存在事务未及时提交的情况
内容的提问来源于stack exchange,提问作者nmcilree
相关产品推荐
相关产品推荐

