如何根据当前对象字段值显示不同的内联

Arm*_*ués 8 django django-admin inline-formset

给定一个名为MainModela和a 的模型RelatedModel,其中后者有一个ForeignKey字段MainModel:

class MainModel(models.Model):
    name = models.CharField(max_length=50)
    type = models.BooleanField()

class RelatedModel1(models.Model):
    main = models.ForeingKey(MainModel):
    name = models.CharField(max_length=50)

class RelatedModel2(models.Model):
    main = models.ForeingKey(MainModel):
    name = models.CharField(max_length=50)
Run Code Online (Sandbox Code Playgroud)

和相应的ModelAdmin类:

class RelatedModel1InlineAdmin(admin.TabularInline):
    model = RelatedModel1

class RelatedModel2InlineAdmin(admin.TabularInline):
    model = RelatedModel2

class MainModel(admin.ModelAdmin):
    inlines = [RelatedModel1, RelatedModel2]
Run Code Online (Sandbox Code Playgroud)

这是默认行为,你得到两个内联,每个相关模型一个.现在的问题是如何完全隐藏所有的内联的时候MainModel正在创建实例(ModelAdminadd_view),并显示了内联RelatedModel1type的现场MainModel实例True,并显示了内联RelatedModel2False.

我打算为属性创建一个描述符ModelAdmin.inline_instances,但我意识到我需要访问正在编辑的对象实例,但它作为参数传递.

有帮助吗?

谢谢!

Yuj*_*ita 1

从偷看看起来contrib.admin.options.py你可以覆盖ModelAdmin.get_formsets。请注意,管理站点self.inline_instances在 处填充__init__,因此您可能希望遵循而不是一遍又一遍地实例化您的内联。我不知道它有多贵:)

def get_formsets(self, request, obj=None):
    if not obj:
        return [] # no inlines

    elif obj.type == True:
        return [MyInline1(self.model, self.admin_site).get_formset(request, obj)]

    elif obj.type == False:
        return [MyInline2(self.model, self.admin_site).get_formset(request, obj)]

    # again, not sure how expensive MyInline(self.model, self.admin_site) is. 
    # the admin does this once. You could instantiate them and store them on the 
    # admin class somewhere to reference instead.
Run Code Online (Sandbox Code Playgroud)

原来的管理员get_formsets使用生成器 - 你也可以更接近地模仿原来的:

def get_formsets(self, request, obj=None):
    for inline in self.inline_instances:
        yield inline.get_formset(request, obj)
Run Code Online (Sandbox Code Playgroud)