Django:在GenericStackedInline中禁止can_delete

23 投票
2 回答
6532 浏览
提问于 2025-04-15 14:34

我创建了一个模型,这个模型里面有一个通用的外键:

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')

接下来,我做了一个通用的堆叠内联,以便把它放到任何ModelAdmin类里:

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这个参数,我在管理界面的修改表单中还是总能看到一个删除的复选框。

这里有一个例子:http://img8.imageshack.us/img8/3323/screenshotbe.png

你知道怎么去掉这个复选框吗?

谢谢你 :)

2 个回答

45

这可能是2009年之后的新特性,但你可以在不重写__init__()方法的情况下进行设置:

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

更新于2016年:根据Stan的回答,现在的django版本允许你在GenericStackedInline这个子类上设置 can_delete = True,因为它是从InlineModelAdmin继承来的。


我之前也遇到过这个问题——出于某种原因,直接把can_delete作为参数传递是没用的,但在表单集的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

撰写回答