2009-11-25 65 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 
相關問題