我如何有条件地否决Django Admin 1.5中的删除尝试?

时间:2014-02-18 22:19:42

标签: python django django-admin

docs明确指出ModelAdmin.delete_model()必须删除该对象,并且不是否决权。麻烦的是,他们没有给出任何暗示 如何实施你需要的

这是一些背景知识,因为也许有更好的方法可以解决我想要完成的任务。我正在Django 1.5应用程序中捕获iptables规则,并希望使用Admin页面来处理所有维护。我有两个与手头问题相关的模型: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在这里会很棒!)或一个内置的目标(例如,'接受'或'DROP'),我宁愿不公开链(嘿,这里的ForeignKey不会那么热!)。

现在进退两难。 Admin UI对于将Target链接到用户定义的链是一个小小的笨拙,因为它没有被定义为FK所以我决定使用常规字符输入字段,而clean_name()可以处理验证以确保Target的链存在。我坚持如何防止删除目标引用的链。

1 个答案:

答案 0 :(得分:3)

您应该可以通过覆盖has_delete_permission(request, obj)管理员中的Chain来完成此操作。您可以查看obj以查看是否有Targets引用它。请参阅the docs

但这不会阻止通过更改列表视图中的删除所选操作进行删除。您可以通过使用您自己的操作覆盖内置delete_selected操作来解决此问题,如果不应删除任何项目,则拒绝执行删除操作。请参阅Admin action docs