Django:禁止在GenericStackedInline上使用can_delete

use*_*455 21 python generics django django-admin 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')
Run Code Online (Sandbox Code Playgroud)

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

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

class SomeOhterModelAdmin(admin.ModelAdmin):
    inlines = [MyModelStackedInline]
Run Code Online (Sandbox Code Playgroud)

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

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

你知道如何删除这个复选框?

谢谢 :)

Sta*_*tan 35

也许这是一个'09后的功能,但您可以指定,但不覆盖该__init__()方法:

class StupidCarOptionsInline(admin.StackedInline):
    model = models.StupidOption
    form = StupidCarOptionAdminForm
    extra = 0
    can_delete = False
Run Code Online (Sandbox Code Playgroud)

  • "can_delete = False"正是我所寻找的. (3认同)
  • 这是最好的 (2认同)

Gre*_*reg 13

2016年更新:根据Stan的回答,django的现代版本允许你can_delete = TrueGenericStackedInline子类上设置,因为它继承自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
Run Code Online (Sandbox Code Playgroud)

然后在你的管理内联类:

class MyModelStackedInline(generic.GenericStackedInline):
    model = MyModel
    formset = MyInlineFormset
    extra = 0
Run Code Online (Sandbox Code Playgroud)