2011-09-30 52 views
2

假設我們有兩個自遞歸關係的典範:模型在Django管理遞歸自我關係

class Article(Item): # Item in this case is an abstract class 
    date = models.DateField() 
    parent = models.OneToOneField('self', null=True, blank=True) 
    subatricles = models.ForeignKey('self', null=True, blank=True, related_name='subs') 

文章在此充當一個節點 - 它可以有很多孩子(如果提供)和一個父(如果有的話)。然而,當我在Django的管理員中註冊我的模型時,我的子標題顯示爲「一對一」 - 在這兩種情況下都有選擇框,但後者中的多個值不能被選中,不過,可以添加多個值。通過管理窗格本條對象和後面的孩子列出他們

我想有是這樣的:。的 ,而不是正常的下拉

感謝

回答

6

你只需要一個字段父母subarticles爲related_name提供反向查找:

class Article(Item): # Item in this case is an abstract class 
    date = models.DateField() 
    parent = models.ForeignKey('self', null=True, blank=True, related_name='subarticles') 

因此,如果您有一篇文章對象,你想獲得其母公司,用途:

article.parent 
如果你想獲得它的孩子

,使用:

article.subarticles 

在管理界面來顯示subarticles最簡單的方法就是給我們e InlineModelAdmin

class ArticleInline(admin.StackedInline): 
    model = Article 

class ArticleAdmin(admin.ModelAdmin): 
    inlines = [ 
     ArticleInline, 
    ] 
+0

非常感謝您的解釋 - 它幫助了我很多。雖然我有一點(我希望是最後一個)問題。如果我指定要顯示的字段:'fieldsets = [(None,{'fields':...'parent','subatricles']})''Django顯示我'錯誤地配置在...'ArticleAdmin.fieldsets [0] [1] ['fields']'指的是表單中缺少的字段'subarticles'。我怎樣才能避免這種情況?我希望能夠將現有的文章添加到文章的孩子們在多選框中選擇他們。 – laszchamachla

+0

@Up - 我需要類似的解決方案,如下所示:[link](http://stackoverflow.com/questions/1691299/can-django-admin-handle-a-one-to-many-relationship-via-related-name/5018393#5018393)對於Django中的ManyToMany問題Admin: – laszchamachla

+0

您將能夠添加孩子到文章,這就是「內聯」的用途。順便說一句,如果你只有一個字段集,根本不需要指定它。完全從管理員那裏拿出「fieldset」,它現在工作嗎? –