如何在Django admin中处理多个子类型的一个超类型

时间:2010-03-15 02:02:31

标签: django django-admin inlines

添加/编辑多个子类型的最佳解决方案是什么。

例如超类型类与子类型客户端和子类型类供应商联系。此处显示的方式有效,但是当您编辑联系人时,您将获得两个内联,即子类型客户端和子类型供应商。

因此,即使您只想添加客户,您也可以获得供应商的字段,反之亦然。如果添加第三个子类型,则会获得三个子类型字段组,而实际上只需要一个子类型组,在上述示例中:客户端。

E.g:

class Contact(models.Model):
    contact_name = models.CharField(max_length=128)

class Client(models.Model):
    contact = models.OneToOneField(Contact, primary_key=True)
    user_name = models.CharField(max_length=128)

class Supplier(models.Model):
    contact.OneToOneField(Contact, primary_key=True)
    company_name = models.CharField(max_length=128)

和admin.py

class ClientInline(admin.StackedInline):
    model = Client

class SupplierInline(admin.StackedInline):
    model = Supplier

class ContactAdmin(admin.ModelAdmin):
    inlines = (ClientInline, SupplierInline,)

class ClientAdmin(admin.ModelAdmin):
    ...

class SupplierAdmin(admin.ModelAdmin):
    ...

现在,当我想添加客户端时,即只有客户端我编辑联系人,我获得了客户和供应商的内联。对于供应商来说当然也是如此。

有没有办法避免这种情况?当我想添加/编辑客户时,我只看到Inline for Client,当我想添加/编辑我只看到供应商内联的供应商时,添加/编辑联系人?

或者也许有不同的方法。任何帮助或建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果不是使用一对一的外键来代替您继承的话,该怎么办?

class Contact(models.Model):
    contact_name = models.CharField(max_length=128)

    class Meta:
        abstract=True # Don't use this line if you want Contact to have its own table

class Client(Contact):
    user_name = models.CharField(max_length=128)

class Supplier(Contact):
    company_name = models.CharField(max_length=128)

然后您可以注册客户和供应商,他们将共享来自联系人的字段,但仍然是彼此分开的。