我发现Django Admin的默认models.ManyToManyField
小部件使用起来很麻烦。它是HTML select元素,如果你有很多“其他”模型的对象,那么实际找到你想要与“this”对象关联的“其他”对象是非常不切实际的。如果你有 很多 的“其他”模型的对象,它似乎甚至会降低管理页面的渲染速度。
我知道我可以构建自己的自定义管理窗口小部件并将其应用到我的ManyToManyFields
中,但我是否有可能使用的预构建的窗口小部件?在我的梦中,我想象一个自动完成的文本输入HTML小部件。这在Django管理框架中是否实用/可行?
感谢。
答案 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