在Django Admin中反转内联

11 投票
3 回答
7148 浏览
提问于 2025-04-17 07:24

我有两个模型,分别是模型A和模型B。现在我想把模型A直接放到模型B的页面上。

这是模型的代码:models.py

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

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

这是管理后台的代码:admin.py

class A_Inline(admin.TabularInline):  
    model = A

class B_Admin(admin.ModelAdmin): 
    inlines = [A_Inline]

这样做可以吗?如果可以的话,请告诉我。

3 个回答

1

当然可以这样做。每种关系,不管是一对一、一对多还是外键,都会有一个反向访问器。关于外键的反向访问,可以在这里了解更多

class A_Inline(admin.TabularInline):  
    model = A.b_set.through

class B_Admin(admin.ModelAdmin): 
    inlines = [A_Inline]
1

你不能按照timmy O'Mahony说的那样做。不过,如果你想的话,可以把B放在A里面。或者你也可以调整Django的显示方式,具体可以在下面的代码中进行设置:

def unicode(self):

models.py

class A(models.Model):
    name = models.CharField(max_length=50)
    def __unicode__(self):
        return self.name

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

admin.py

class B_Inline(admin.TabularInline):  
    model = B
class A_Admin(admin.ModelAdmin):
    inlines = [
        B_Inline,
    ]
admin.site.register(A, A_Admin)
admin.site.register(B)

或者你可能想使用多对多的关系?

models.py

class C(models.Model):
    name = models.CharField(max_length=50)
    def __unicode__(self):
        return self.name
class D(models.Model):
    name = models.CharField(max_length=50)
    cs = models.ManyToManyField(C)

admin.py

class C_Inline(admin.TabularInline):  
    model = D.cs.through
class D_Admin(admin.ModelAdmin):
    exclude = ("cs",)
    inlines = [
        C_Inline,
    ]
admin.site.register(C)
admin.site.register(D, D_Admin)
0

不可以,因为A需要有一个指向B的外键,这样才能作为一个内联使用。否则,当你保存内联的A时,怎么记录它们之间的关系呢?

撰写回答