我如何有条件地否决Django Admin 1.5中的删除尝试?
作者:互联网
docs明确指出ModelAdmin.delete_model()必须删除该对象,并且它不是出于否决目的.麻烦的是,他们没有给您任何提示,您可以根据需要实施否决权.
这是一些背景,因为也许有一种更好的方法来实现我要完成的任务.我正在Django 1.5应用程序中捕获iptables规则,并希望使用管理页面来处理所有维护工作.我有两个与手头问题相关的模型:Chain和Target.这是这些模型的症结所在:
class Chain(models.Model):
"""A netfilter chain."""
name = models.CharField(max_length=30, unique=True, primary_key=True)
built_in = models.BooleanField(
default=False,
help_text=u'This option should be selected if this chain is one of '
u'those provided by netfilter. Leaving this option '
u'unselected indicates that the chain is user-defined.'
)
table = models.ForeignKey(Table, verbose_name='netfilter table')
class Target(models.Model):
"""A netfilter target."""
name = models.CharField(
max_length=30, unique=True, primary_key=True,
help_text=u'This may be either an iptables built-in target or a '
u'user-defined chain. Built-in targets must be one of '
u'those supported by iptables.'
)
built_in = models.BooleanField(
default=False, verbose_name='built-in',
help_text=u'This option should be selected if this target is one of '
u'those provided by netfilter. Leaving this option '
u'unselected indicates that the target is user-defined.',
)
因此,Chain表将具有“ FORWARD”,“ INPUT”和“ OUTPUT”的记录,这些记录都是内置的并链接到“ filter”表.当然,管理员也可以在此处输入其他用户定义的链,但是将使用Built_in == False设置那些链.
尽管与目标很奇怪.他们可以引用一个链(嘿,这里的ForeignKey会很棒!)或一个我不想公开为链的内置目标(例如,“ ACCEPT”或“ DROP”)(嘿,一个外键赢得了这里不是那么热!).
现在的困境. Admin UI对于将目标链接到用户定义的链来说有点笨拙,因为它没有定义为FK,因此我选择了一个常规字符输入字段,并且clean_name()可以进行验证以确保目标链存在.我对如何防止删除目标所引用的链条有些困惑.
解决方法:
您应该能够通过在Chain管理员中覆盖has_delete_permission(request,obj)来完成此任务.您可以检查obj以查看是否有任何目标正在引用它.参见the docs.
但是,这不会阻止通过更改列表视图中的“删除选定的操作”进行删除.您可以通过使用内置的delete_selected操作覆盖您自己的操作来解决此问题,如果您不应删除任何一项,则该操作拒绝执行删除操作.参见Admin action docs.
标签:django-admin,python,django 来源: https://codeday.me/bug/20191122/2057008.html