Django DeleteView修改关联模型字段报错:form无instance属性
问题原因
你报错的核心原因是:DeleteView默认的删除表单并没有instance属性,你通过form.instance访问对象的方式是错误的。要实现删除BookingTable前修改关联Table的状态,需要正确获取待删除的BookingTable实例。
解决方案
以下两种方案都能实现你的需求:
方案一:重写delete方法(推荐)
直接在删除操作的核心方法中,先修改关联表状态再执行删除:
class CancelBookingView(DeleteView): model = BookingTable template_name = 'cancel_booking.html' success_url = reverse_lazy('list_tables') def delete(self, request, *args, **kwargs): # 获取待删除的BookingTable实例 self.object = self.get_object() # 修改关联Table的占用状态并保存 self.object.table.ocupation_status = False self.object.table.save() # 执行删除操作 return super().delete(request, *args, **kwargs)
方案二:修正form_valid方法
如果坚持使用form_valid,需通过self.object获取待删除实例:
class CancelBookingView(DeleteView): model = BookingTable template_name = 'cancel_booking.html' success_url = reverse_lazy('list_tables') def form_valid(self, form): # 获取待删除的BookingTable实例 self.object = self.get_object() # 修改关联Table的占用状态并保存 self.object.table.ocupation_status = False self.object.table.save() # 调用父类方法完成删除 return super().form_valid(form)
补充提示
- 必须调用
save()方法,否则对Table字段的修改不会同步到数据库 - 注意字段拼写:你的
Table模型中ocupation_status少了一个字母c,正确拼写应为occupation_status,建议修正避免后续维护问题
内容的提问来源于stack exchange,提问作者lerton josine
相关产品推荐
相关产品推荐

