2010-05-17 81 views
1

我有以下型號:Django admin:我如何將不相關的模型字段添加到模型更改/添加頁面?

class Foo(models.Model): 
    field1 = models.IntegerField() 
    ... 

class Bar(models.Model): 
    field1 = models.IntegerField() 
    ... 

class Foo_bar(models.Model): 
    foo = models.ForeignKey(Foo) 
    bar = models.ForeignKey(Bar) 
    ... 

在管理,我想它,以便在富變化/添加頁面,你可以指定一個Bar對象,並保存我想創建一個foo_bar這樣的名稱對象代表關係。我如何通過自定義管理網站/ ModelAdmins來做到這一點?請注意,內聯並不是我所需要的,因爲foo和bar之間沒有明確的外鍵關係。其次,我實際上並不想編輯欄對象,我只想從系統中選擇。

謝謝。

回答

2

你確定你不只想要一個ManyToManyField?在管理員中,這將顯示爲Bar對象的多選列表。查看User的管理員的組選擇部分。

如果您需要連接到關係額外的數據,你可以use a through parameter

class Foo(models.Model): 
    field1 = models.IntegerField() 
    bars = models.ManyToManyField("Bar", related_name="foos", through="Foo_bar") 

你需要foo_bar這樣的名稱,以便在管理編輯這些額外的參數添加到管理員。

+0

謝謝!如果我在Bar中聲明ManyToManyField,是否可以將它顯示在Foo中? – Neil 2010-05-18 00:24:04

+0

這就是'related_name'參數的全部內容。使用我的例子,每個'Foo'對象都有一個'bars'字段,它是M2M,並且每個'Bar'對象都有一個'foos'字段,它是反向關係。所以,你把'ManyToManyField'放入哪一個並不重要;你會自動獲得兩個方向。只是不要把它放在兩個模型中,否則會嘲笑你。 – 2010-05-18 02:47:32

+0

同時檢查'ForeignKey'文檔中描述的'limit_choices_to'參數,以便保持列表大小不變。還有一件事:在管理員中,關係只出現在管理員爲聲明「ManyToManyField」的模型中。 – 2010-05-18 02:50:33

1

我能想到的兩種可能性:

  1. 你可以爲你的Foo模型創建一個自定義表單並添加含有Bar.objects.all()查詢集到它的字段。然後覆蓋ModelAdmin的默認save_form()方法,以在保存對象時創建新的Bar實例。

  2. 您可以創建自定義字段類,它通過'post_save`信號添加到您Foo模式,類此功能...

相關問題