Django:在GenericStackedInline中禁止can_delete
我创建了一个模型,这个模型里面有一个通用的外键:
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