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的链存在。我坚持如何防止删除目标引用的链。
答案 0 :(得分:3)
您应该可以通过覆盖has_delete_permission(request, obj)
管理员中的Chain
来完成此操作。您可以查看obj
以查看是否有Targets
引用它。请参阅the docs。
但这不会阻止通过更改列表视图中的删除所选操作进行删除。您可以通过使用您自己的操作覆盖内置delete_selected
操作来解决此问题,如果不应删除任何项目,则拒绝执行删除操作。请参阅Admin action docs。