在Django admin中内联多个一对一字段

时间:2009-11-25 13:02:12

标签: django django-admin

我无法让管理模块以一对一的关系内联两个相同的字段模型。为了说明这一点,我做了以下示例,模型Person使用两个地址:

class Client(models.Model):
    # Official address
    official_addr = models.OneToOneField(Address, related_name='official')
    # Temporary address
    temp_addr = models.OneToOneField(Address, related_name='temp')

我想通过Django管理界面添加人员,内联两个地址。到目前为止,我有管理员配置的代码:

class ClientInline(admin.StackedInline):
    model = Client
    fk_name = "official_addr"

class ClientInline2(admin.StackedInline):
    model = Client
    fk_name = "temp_addr"

class AddressAdmin(admin.ModelAdmin):
    inlines = [ClientInline,ClientInline2]

admin.site.register(Address, AddressAdmin)

它适用于第一个地址,但是这两个地址的界面都很疯狂 - 复制客户端的字段而不是地址。我做错了什么?有没有更好的方法让两个相同的模型内联?

3 个答案:

答案 0 :(得分:4)

使用以下内容替换您的管理员:

class ClientInline(admin.StackedInline):
    model = Client
    max_num = 1

class AddressAdmin(admin.ModelAdmin):
    inlines = [ClientInline]

admin.site.register(Address, AddressAdmin)

答案 1 :(得分:0)

我无法通过复制客户的字段来理解你对'表演疯狂'的意思。这正是你要求它做的 - 你有两个内联,都指客户。如果这不是你想要的,你需要反过来定义它。

答案 2 :(得分:0)

您可以通过=使用ManyToMany关系 在您的示例中,它将涉及AddressType模型

class Client(models.Model):
    addresses = ManyToManyField(Address, through=AddressType, related_name='address_clients')

class AddressType(models.Model):
    type = models.CharField('Type', max_length=255, unique=True)
    client = models.ForeignKey(Client, related_name='client_address_types')
    address = models.ForeignKey(Address, related_name='address_client_types')

现在由管理员添加2个对象并使用它

以后如果你想添加更多类型,只需要通过管理员添加1类型))例如工作地址

在视图中易于使用:

client = Client.objects.get(id=...)
client_tmp_address = client.addresses.get(address_client_types_type='temporary') # If you added temporary Type before