Django deep admin.TabularInline

时间:2017-10-18 08:51:47

标签: python django django-admin

如果存在如下关系:UML1

B.ForeignKey(A)

django可以通过onepage admin TabularInline中显示:

admin.py

from django.contrib import admin
from myapp2 import models
# Register your models here.
class TabularInlineB(admin.TabularInline):
    model=models.B

class AdminA(admin.ModelAdmin):
    inlines=[TabularInlineB, ]

admin.site.register(models.A, AdminA)

models.py

from django.db import models

# Create your models here.

class A(models.Model):
    name=models.CharField(max_length=10)

class B(models.Model):
    name=models.CharField(max_length=10)
    a=models.ForeignKey(A)

。输出类似于:output1

但如果我们addForeignKey的另一个B关系如下, UML2

B.ForeignKey(A)
C.ForeignKey(B)

然后如何在one admin page中显示所有模型?

admin.py

from django.contrib import admin
from myapp2 import models

class TabularInlineC(admin.TabularInline):
    model=models.C

class TabularInlineB(admin.TabularInline):
    model=models.B
    inlines=[TabularInlineC, ]

class AdminA(admin.ModelAdmin):
    inlines=[TabularInlineB, ]

admin.site.register(models.A, AdminA)

models.py

from django.db import models

# Create your models here.

class A(models.Model):
    name=models.CharField(max_length=10)

class B(models.Model):
    name=models.CharField(max_length=10)
    a=models.ForeignKey(A)

class C(models.Model):
    b=models.ForeignKey(B)
    name=models.CharField(max_length=10)

输出剂量未显示C:outpu2

1 个答案:

答案 0 :(得分:1)

我有同样的问题,我设法做到了。我不知道它是否正是您所需要的,但请告诉我,如果不是我将删除我的答案。

你可以这样做:

<强> Admin.py

from django.contrib import admin
from myapp2 import models

class TabularInlineC(admin.TabularInline):
    model=models.C

class TabularInlineB(admin.TabularInline):
    model=models.B      

class AdminA(admin.ModelAdmin):
    inlines=[TabularInlineB, TabularInlineC ]

admin.site.register(models.A, AdminA)

这将呈现两个内联,每个内联在模型A的管理页面中都有一个部分。请注意,在此代码中,模型B和模型C都具有模型A的外键。实际上,这与您的模式不完全相同在你的问题中使用,但在我看来,它是实现你想要的最简单的方法。您将两个模型指向相同的事实,允许您考虑此模型具有 父模型 。因此,如果您可以找到要指向的公共字段,则可以在同一表单中添加两个内联,因为两个模型都将具有指向模型A的链接。

另外,您可以做的另一个有趣的事情是classes = ['collapse']class TabularInlineB同时添加class TabularInlineC这将允许您在管理页面的这两个部分进行折叠。

希望它有所帮助!

修改

如果你只需要渲染一个包含两个模型的内联,我也不确定它是否可以开箱即用Django。