Django:禁止在GenericStackedInline上使用can_delete

时间:2009-09-24 10:16:37

标签: python django django-admin generics formset

我构建了这个包含通用外键的模型:

class MyModel(models.Model):
    content_type = models.ForeignKey(ContentType, verbose_name=_('content type'))
    object_id = models.PositiveIntegerField(_('object id'))
    content_object = generic.GenericForeignKey('content_type', 'object_id')

接下来我制作了一个通用的堆叠内联,将它放在任何ModelAmin类中:

class MyModelStackedInline(generic.GenericStackedInline):
    model = MyModel
    formset = generic.generic_inlineformset_factory(MyModel, can_delete=False)
    extra = 0

class SomeOhterModelAdmin(admin.ModelAdmin):
    inlines = [MyModelStackedInline]

但是,尽管在generic_inlineformset_factory中传递了_ delete=False arg,但我总是在管理员change_form中看到Delete复选框。

以下是一个示例:http://img8.imageshack.us/img8/3323/screenshotbe.png

您知道如何删除此复选框吗?

谢谢:)

2 个答案:

答案 0 :(得分:34)

也许这是09后的一项功能,但你可以在不覆盖__init__()方法的情况下指定:

class StupidCarOptionsInline(admin.StackedInline):
    model = models.StupidOption
    form = StupidCarOptionAdminForm
    extra = 0
    can_delete = False

答案 1 :(得分:12)

更新2016:根据Stan的回答,django的现代版本允许您在can_delete = True子类上设置GenericStackedInline,因为它继承自InlineModelAdmin


我之前遇到过这种情况 - 由于某种原因,传递can_delete作为参数不起作用,但是在formset的 init 方法中设置它会。试试这个:

class MyInlineFormset(generic.generic_inlineformset_factory(MyModel)):
    def __init__(self, *args, **kwargs):
        super(MyInlineFormset, self).__init__(*args, **kwargs)
        self.can_delete = False

然后在您的管理员内联课程中:

class MyModelStackedInline(generic.GenericStackedInline):
    model = MyModel
    formset = MyInlineFormset
    extra = 0