在Django 2.0中,如何在generic.DeleteView中处理ProtectedError
我的一般观点声明如下:在Django 2.0中,如何在generic.DeleteView中处理ProtectedError,django,django-models,django-views,Django,Django Models,Django Views,我的一般观点声明如下: class CustomerDelete(LoginRequiredMixin,DeleteView): model = models.Customer success_url = reverse_lazy('customer-list') class Order(models.Model): Customer = models.ForeignKey(Customer, on_delete=models.PROTECT, default=No
class CustomerDelete(LoginRequiredMixin,DeleteView):
model = models.Customer
success_url = reverse_lazy('customer-list')
class Order(models.Model):
Customer = models.ForeignKey(Customer, on_delete=models.PROTECT, default=None)
Shop = models.ForeignKey(Shop, on_delete=models.PROTECT, default=None)
Status = models.IntegerField(choices=STATUS);
Reference = models.CharField(max_length=50)
Date = models.DateTimeField(default=None)
LastAuthorizationDate = models.DateTimeField(default=None, null=True)
LastUpdated = models.DateTimeField(auto_now=True)
def get_absolute_url(self):
return reverse_lazy('order-view', None, [self.id])
def type(self):
return 'Order'
def Name(self):
return self.Customer.Name + ' - ' + self.Shop.Name + ' - ' + self.Reference
以及声明如下的模型:
class CustomerDelete(LoginRequiredMixin,DeleteView):
model = models.Customer
success_url = reverse_lazy('customer-list')
class Order(models.Model):
Customer = models.ForeignKey(Customer, on_delete=models.PROTECT, default=None)
Shop = models.ForeignKey(Shop, on_delete=models.PROTECT, default=None)
Status = models.IntegerField(choices=STATUS);
Reference = models.CharField(max_length=50)
Date = models.DateTimeField(default=None)
LastAuthorizationDate = models.DateTimeField(default=None, null=True)
LastUpdated = models.DateTimeField(auto_now=True)
def get_absolute_url(self):
return reverse_lazy('order-view', None, [self.id])
def type(self):
return 'Order'
def Name(self):
return self.Customer.Name + ' - ' + self.Shop.Name + ' - ' + self.Reference
删除后,我得到以下异常:
位于/customer/2/delete/(“无法删除某些实例”)的ProtectedError
模型“Customer”的引用,因为它们是通过受保护的
外键:“Order.Customer”,
,,]>)
覆盖和捕获异常的最佳类方法是什么,它允许我重定向到附加了错误的引用者
提前感谢。要添加自定义逻辑,您需要覆盖
delete
方法:
class CustomerDelete(LoginRequiredMixin,DeleteView):
model = models.Customer
success_url = reverse_lazy('customer-list')
error_url = reverse_lazy('customer-has-orders-error')
def get_error_url(self):
if self.error_url:
return self.error_url.format(**self.object.__dict__)
else:
raise ImproperlyConfigured(
"No error URL to redirect to. Provide a error_url.")
def delete(self, request, *args, **kwargs):
"""
Call the delete() method on the fetched object and then redirect.
"""
self.object = self.get_object()
success_url = self.get_success_url()
error_url = self.get_error_url()
try:
self.object.delete()
return HttpResponseRedirect(success_url)
except models.ProtectedError:
return HttpResponseRedirect(error_url)
如果您打算经常使用它,您可以使用上述逻辑创建您自己的自定义混合
此外,考虑在应用程序中实现软删除,这样记录不会立即从数据库中删除,而是在以后被标记为删除,一旦它们被归档。否则,您的业务逻辑可能会出现问题。
我遇到此错误:与“customer has orders error”相反,但未找到任何参数。已尝试1个模式:…
。在我看来,我使用了DeleteView的URL。我可能做错了什么?