2012-11-20 33 views
1

我在我的應用程序中有ToolsTasks之間的多對多關係。現在在Task模型上定義了多對多關係,例如在管理員的Task編輯頁面中,我有一個<select multiple>控件,允許您選擇0個或多個ToolsTask關聯。Django Admin:在多對多關係中將<select multiple>添加到* other *模型

我知道Django不允許您在兩個模型上定義關係,但是是否仍然可以告訴管理員在Tool編輯頁面上包含<select multiple>?我希望能夠從它的任何一方編輯關係。

+0

您可以編輯管理員表單(設置)並擴展保存方法?選擇多個只是一個小部件,沒有什麼特別的 –

回答

1

像這樣的東西應該工作(給M2M在Tool指定):

# 1st app 
from secondapp.models import Tool 

class Task(models.Model): 
    tools = models.ManyToManyField(Tool, through=Tool.tasks.through) 

# 2nd app 
class Tool(models.Model): 
    tasks = models.ManyToManyField("firstapp.Task") 
+0

我的兩個模型是在兩個不同的應用程序,所以你如何避免循環導入? (順便說一下,它的任務和工具,而不是標籤和工具。) –

+0

我更新了答案,以處理不同的應用程序和命名:)沒有嘗試它,但我認爲這應該工作。 – bmihelac

+0

這是一個很好的想法,但它不會爲我工作。在任務中定義了m2m,你的邏輯意味着我應該將app1.Task的導入移動到app2.models中。但是,app1也會在其他位置引用app2.Tool,所以我無法按照您的建議移動導入。 –

0

你可以嘗試創建ToolsTasks充當中間人之間的假人模型,東西Django的通常提供用於存儲有關特定關係的額外信息。在創建此ManyToMany關係時,您可以使用through=關鍵字來利用該關係。

你可以找到有關該here的細節。

我還沒有真正採取一起來看看它的管理頁面上,但一旦你註冊管理頁面上的模型我會想象,因爲這種模式有一個ForeignKey關係Tools每個Tasks,你應該能夠從虛擬模型編輯雙方的關係。

但是,我不一定會推薦這個,除非它是超級必需的,你能夠訪問雙方的關係。

0

我不會使用through或使您的模型複雜化,只是爲了讓管理員看起來很好。您也可以嘗試creating an admin inline。使用內聯,您可以在管理應用程序的任何模型的屏幕中添加小節。文檔中有一些很好的例子。