2011-03-22 101 views
84

我覺得Django Admin的默認models.ManyToManyField控件很麻煩。它是HTML select元素,並且如果有很多「其他」模型的對象,那麼實際查找要與「this」對象關聯的「其他」對象是非常不切實際的。如果你有很多的「其他」模型的對象,它似乎甚至減緩了管理頁面的渲染速度。一個更好的Django管理員ManyToMany字段控件

我知道我可以構建自己的自定義管理小部件,並將其應用到我的ManyToManyFields,因爲我認爲合適,但是有沒有可以使用的預製構件?在我的夢中,我畫了一個自動完成的文本輸入HTML小部件。這在Django管理框架中甚至可行嗎?

謝謝。

回答

135

嘗試使用您的管理類filter_horizontal屬性,例如:

class SomeModelAdmin(admin.ModelAdmin): 
    filter_horizontal = ('users',) 

正如the documentation提到,「增加一個ManyToManyField到這個列表將改爲使用一個漂亮的不顯眼的JavaScript的‘過濾器’的界面,使搜索在選項內「。 filter_vertical做了同樣的事情,佈局略有不同。

+0

太棒了!這聽起來像我正在尋找的,我會試一試。 – 2011-03-22 16:01:19

+2

優秀,它使得許多東西更清晰地使用 – maazza 2013-08-02 09:55:49

+0

它的工作但如何使這個領域只讀。我嘗試 read only_fields =('users',)。但它顯示在用逗號分隔的單行中。我想在換行符中顯示... – 2014-12-31 08:11:41

6

你可以嘗試在管理員中使用原始ID。 和Django文檔: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields

,如果你正在尋找的東西與自動完成,你可能想在這個看作是一個起點http://code.djangoproject.com/wiki/AutoCompleteSolutions

最後一個非常簡單的在線例子:

models.py中

class SomeModel(models.Model): 
    users = models.ManyToMany(User) 

admin.py:

class SomeModelAdmin(admin.ModelAdmin): 
    raw_id_fields = ("users",) 
3

我還沒有玩過它,但我發現其他地方引用了this promising looking library

它看起來正是我想要的。而不是加載相關對象的整個列表(不管有多少個!),並向您展示一個選擇器來選擇其中的一些對象,如filter_horizontal所做的那樣,它會顯示一個搜索/過濾器框並使用typeahead/autocomplete調用來檢索動態結果。這對於您可能有5000個用戶並希望從中選擇3個或4個而不等待5k <option>元素下載和渲染的情況非常有用。

相關問題