2010-10-07 78 views
1

我仍然堅持在同一頁面上使用相關模型的內聯樹樣式。 我有三個型號,A,B和CDjango:使用inlineformset對相關模型進行內聯編輯

Class A 

Class B 
    fb = foreignkey(A) 

Class C 
    fc = foreignkey(B) 

在admin.py我做這樣的事情

AdminA 
    inlines = [inlineB] 

AdminB 
    inlines = [inlineC] 

我想,當我編輯/添加模型A,I應該能夠在線添加ModelB,並添加模型B的相關模型C條目。我正在嘗試使用inlineformsets,但無法找到如何將它們用於我的目的。此外,我發現this old discussion on same problem。但是,再次,因爲我是新來的Django,我不知道如何使它工作。

+0

_What的添加頁面你真的到目前爲止試試嗎?_你做了一個相關的問題12小時前,其中你說模型B僅僅定義了A和C之間的關係。我曾經與django-tagging中的模型有類似的設置,它基本上使用'TaggedItem'的'GenericInlineAdminForm'工作,它也主要定義標籤,標籤對象和內容類型之間的關係。但是,如果您僅指出相當抽象的問題,則無法期望在此得到有用的答案。 – 2010-10-07 13:39:23

+0

12小時前,是B是抽象類。但沒有更長的時間,我對班上做了一些改變。早些時候,我希望找到一些內置的解決方案,比如如果你想創建一個foreginkey對象就會出現的彈出窗口。現在我正在嘗試創建一個inlineformset類型的結構。所以在Inline行中,我希望除了B的字段外,我還能夠添加C類對象的實例。所以尋找一個使用模型,inlineformsets等自定義的formset解決方案。事實上,我的問題是完全一樣的,我提到的鏈接。你可以填寫我的解決方案的細節嗎? – Neo 2010-10-07 13:53:04

+1

請查看http://docs.djangoproject.com/en/1.2/ref/contrib/admin/#inlinemodeladmin-objects。如果您爲模型B定義了InlineAdminForm,例如派生自admin.TabularInline,你應該得到一個表單顯示,它提供了** + ** - 按鈕,它們可以讓你在彈出窗口中創建C的實例。如果這不起作用,請檢查您的外鍵。您鏈接的問題基本上對您的問題有合理的答案。 – 2010-10-07 14:34:06

回答

2

它有點奇怪的回答你自己的問題,但嘿沒有人加強。並感謝Bernd指引我正確的方向。該解決方案需要制定中間模型。在我的情況下BC類。

class A(models.Model):           
a = models.IntegerField()         


class B(models.Model):           
    fb = models.ForeignKey(A)         
    b = models.IntegerField()         

class C(models.Model):           
    fc = models.ForeignKey(B)         
    c = models.IntegerField()         

class BC(models.Model):          
    fc = models.ForeignKey(A)         
    fb = models.ForeignKey(B)         

而不是在模型A的管理中有InlineB,使用BC的內聯。所以完整的admin.py看起來像。

class InlineC(admin.TabularInline): 
    model = C 
    extra = 1 

class BCInline(admin.TabularInline): 
    model = BC 
    extra = 1 

class AdminA(admin.ModelAdmin): 
    fieldsets = [ 
     (None, { 
      'fields': ('a',) 
      }), 
     ] 
    inlines = [BCInline] 

class AdminB(admin.ModelAdmin): 
    fieldsets = [ 
     (None, { 
      'fields': ('b',) 
      }), 
     ] 
    inlines = [InlineC] 

瞧,我得到popus按鈕來創建B的完整對象,在模型A

+1

在B和C模型中使用IntegerFields的目的是什麼? – antihero 2012-06-20 09:45:04

+0

這是真的彈出?我不這麼認爲。 – andi 2014-03-25 10:08:05

相關問題