2009-11-25 55 views
4

我无法让管理模块在一对一的关系中内联两个相同的字段模型。为了说明它,我做了下面的例子中,一个模型人使用两个地址:在Django中内嵌多个一对一的字段admin

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) 

它完全适用于第一个地址,但随着这两个地址的接口作用疯狂 - 复制客户的领域,而不是地址。我做错了什么?有没有更好的方法让两个相同的模型内联?

+0

它不应该是客户端,而不是克伦特? – ikkebr 2009-11-25 13:31:24

+0

@ikkebr:修好,谢谢。 – Viliam 2009-11-25 19:43:05

回答

4

替换您的管理执行以下操作:

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

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

admin.site.register(Address, AddressAdmin) 
0

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

+1

我想要内置两个地址。他们两人将组成一个人。如果我写的代码是错误的,你能帮我写“反过来”吗?谢谢。 – Viliam 2009-11-25 19:41:14

0

您可以通过= 使用多对多关系与在你的榜样,将一些有关地址类型模型

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 
相关问题