删除模型实例:用于处理get()中的引用的模式

时间:2015-02-21 22:05:43

标签: django django-models django-views

我有几个视图是一个处理模型实例删除的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复制我的功能? 但是稍微退出问题,第二个问题是我在这里使用正确的设计模式吗?我还没有找到一个健壮的模式吗?

由于 森

0 个答案:

没有答案