我有几个视图是一个处理模型实例删除的Django项目。某些模型的业务逻辑表明“如果模型实例已在其他地方引用,则不允许用户删除它”。这已在引用模型的外键上使用on_delete=models.PROTECT
应用。这里没什么不寻常的。
现在到删除视图。事情很好,ProtectedError被post()
捕获,一切都很顺利。但是出于用户体验的原因,我希望在get()
中抓住这个 - 这会保存按钮点击和页面加载。
我迄今为止所做的是使用TransactionMiddleware
并在get请求中删除并回滚。一切都很好:
class PackageTypeDeleteView(DeleteView):
...
def get(self, request, *args, **kwargs):
"""
Check for protected error
"""
self.object = self.get_object()
context = self.get_context_data(object=self.object)
try:
self.object.delete()
transaction.rollback()
return self.render_to_response(context)
except ProtectedError:
context = self.get_context_data()
context['error'] = (
'This package type has been used. ' +
'Edit the package type and change Active to False.')
context['object'] = self.object
transaction.rollback()
return self.render_to_response(context)
然而,在1.6中我不赞成TransactionMiddleware
(我在1.7),我正在删除它。我无法找到实现上述功能的方法。根据{{3}},我尝试在@transaction.atomic
中修改方法,但显然我的问题是我希望事务回滚,无论。
第一个问题是如何使用已弃用的TransactionMiddleware
复制我的功能?
但是稍微退出问题,第二个问题是我在这里使用正确的设计模式吗?我还没有找到一个健壮的模式吗?
由于 森