一个更好的Django管理员ManyToMany Field Widget

时间:2011-03-22 02:01:42

标签: javascript django django-admin html-select

我发现Django Admin的默认models.ManyToManyField小部件使用起来很麻烦。它是HTML select元素,如果你有很多“其他”模型的对象,那么实际找到你想要与“this”对象关联的“其他”对象是非常不切实际的。如果你有 很多 的“其他”模型的对象,它似乎甚至会降低管理页面的渲染速度。

我知道我可以构建自己的自定义管理窗口小部件并将其应用到我的ManyToManyFields中,但我是否有可能使用的预构建的窗口小部件?在我的梦中,我想象一个自动完成的文本输入HTML小部件。这在Django管理框架中是否实用/可行?

感谢。

4 个答案:

答案 0 :(得分:146)

尝试使用管理类的filter_horizontal属性,例如:

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

the documentation中所述,“在此列表中添加ManyToManyField将使用一个漂亮的不显眼的JavaScript”过滤器“界面,允许在选项中进行搜索”。 filter_vertical使用稍微不同的布局做同样的事情。

答案 1 :(得分:7)

您可以尝试在管理员中使用原始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",)

答案 2 :(得分:3)

我还没玩过它,但我发现其他地方引用了this promising looking library

它似乎正是我想要的。而不是加载相关对象的整个列表(无论有多少!)并向您呈现选择器中的一些,如filter_horizontal所示,它提供搜索/过滤器框并使用typeahead /自动完成调用以动态检索结果。这非常适合您可能拥有5000个用户且想要选择其中3个或4个而无需等待5k <option>个元素进行下载和渲染的情况。

答案 3 :(得分:0)

这是一个古老的问题,但是我想在这里为像我一样找到这个问题的人添加一个答案:这种情况正是Django内联管理员的目的。具体来说,对于具有太多选择的多对多关系,我使用具有原始id字段的TabularInlines。

https://docs.djangoproject.com/en/2.1/ref/contrib/admin/#django.contrib.admin.TabularInline