2011-03-22 100 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>元素下载和渲染的情况非常有用。

相关问题