如何在Django中保护对象不被删除?

r1zhe5dt  于 2023-08-08  发布在  Go
关注(0)|答案(4)|浏览(106)

我在我的项目中有一个设置应用程序,这个应用程序使用的DB表中的每个记录都代表特定的设置。重要的是,设置必须始终保持一致,所以我正在寻找方法来保护它们免受管理面板用户或错误代码的意外删除。
此功能的另一种情况可能是-错误消息存储在数据库中,可用于在管理站点或网站用户的电子邮件模板中编辑。
我想到的可能的解决方案:

  • 将每个设置存储为表列或多列,因此表将按列而不是按行扩展。优点-简单,可靠,缺点-丑陋
  • DB侧解决方案。
  • 实现某种权限系统,它将基于对象所有权来控制CRUD操作的访问,就像Linux中的文件系统权限一样。优点-不那么丑陋,从DB抽象,缺点-我还不知道如何为Django轻松优雅地实现它。
    有人有更好的主意吗?
u59ebvdq

u59ebvdq1#

简短的回答是:如果您不希望某人拥有某些数据库能力,请不要授予它们。看来你认为有管理面板超级用户和其他人。
Django允许更多的fine grained control over Users, Permissions, Authorization, and even Admin Panel权限。实际上,文档做得很好,在这里要详细说明的控制太多了。

ih99xse1

ih99xse12#

我不确定我是否完全理解了你的问题,但它是这样的:
我看到了两种保护模型不被删除的方法:

  • 重写delete()方法,并使其检查一组强制执行所需一致性的规则。例如,如果其中一个一致性规则失败,您将引发一个异常以进行正确处理。
  • 另一种是通过授权,又名权限。您可以管理用户删除特定模型的权限,如this answer中所述。

我注意到Django默认权限API不支持特定对象的权限,只支持应用于模型的权限。但是,有第三方应用程序提供此功能,例如this one

iq0todco

iq0todco3#

在Django中,没有真实的的内置方法(我知道)来防止“意外删除”。如果您使用的是管理员,他们确实提供了确认页面,每当你想删除一个记录,可以帮助遏制潜在的问题。正如@msw所提到的,用户身份验证系统旨在帮助您强制执行权限,但如果个人具有适当的权限,则无法防止意外删除...
...另一种策略是完全防止数据库上的删除(在Web应用程序级别)。您可以从用户的Angular 通过标记和过滤出任何“已删除”的记录来给予用户一个删除的“错觉”。这样,恢复信息就像切换/重置记录中的标志一样简单。您还必须覆盖适当的删除信号。

f8rj6qna

f8rj6qna4#

简单的方法是在views.py中使用@staff_member_required

相关问题