更好的Django Admin ManyToMany字段小部件


101

我发现Django Admin的默认models.ManyToManyField小部件使用起来很麻烦。这是HTML select元素,如果您有很多“其他”模型的对象,那么实际上找不到要与“此”对象关联的“其他”对象是不切实际的。而且,如果您有许多 “其他”模型的对象,它甚至会减慢“管理”页面的呈现速度。

我知道我可以构建自己的自定义管理窗口小部件并将其应用到我ManyToManyFields认为合适的位置,但是那里是否有可以用来代替的预构建窗口?在我的梦中,我描绘了一个自动完成的文本输入HTML小部件。在Django管理框架中甚至可行/可行吗?

谢谢。

Answers:


160

尝试filter_horizontal在您的管理类上使用该属性,例如:

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

文档所述,“将ManyToManyField添加到此列表将改为使用一个漂亮的,不引人注目的JavaScript“ filter”接口,该接口允许在选项中进行搜索”。filter_vertical在布局略有不同的情况下执行相同的操作。


大!听起来完全像我要寻找的东西,我会尝试一下。
克里斯·W

它的工作原理是如何使此字段为只读。我尝试read only_fields =('users',)。但其以单行显示,并以逗号分隔。我想在换行中显示...
Varnan K

我担心自己必须编写自己的小部件,但这很完美!感谢那!; P
umat

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",)

3

我实际上并没有玩过它,但是我发现这个在其他地方引用的有前途的库

它似乎完全符合我的要求。而不是加载相关对象的整个列表(无论有多少个对象!),而是为您提供一个选择器来选择其中的几个对象filter_horizontal,而是显示一个搜索/过滤器框,并使用预输入/自动完成调用来检索结果动态地。这对于您可能有5000个用户并且想要选择3个或4个用户而无需等待5k <option>元素下载和渲染的情况非常有用。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.