【问题标题】:A Better Django Admin ManyToMany Field Widget一个更好的 Django Admin 多对多字段小部件
【发布时间】:2011-07-20 03:31:06
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: javascript django django-admin html-select


    【解决方案1】:

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

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

    正如the documentation 中提到的,“将 ManyToManyField 添加到此列表将使用一个漂亮的、不显眼的 JavaScript“过滤器”接口,该接口允许在选项中进行搜索”。 filter_vertical 做同样的事情,但布局略有不同。

    【讨论】:

    • 太棒了!这听起来正是我正在寻找的东西,我会试一试。
    • 它的工作但是如何使这个文件只读。我正在尝试 read only_fields = ('users',) 。但它以逗号分隔的单行显示。我想在换行符中显示...
    • 我担心我必须编写自己的小部件,但这是完美的!感谢那! ;P
    【解决方案2】:

    您可以尝试在管理员中使用原始 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 那样加载相关对象的整个列表(不管有多少!)并为您提供一个选择器来选择其中一些对象,而是提供一个搜索/过滤框并使用预输入/自动完成调用动态检索结果。这非常适合您可能有 5000 个用户并希望选择其中 3 或 4 个而不等待 5k <option> 元素下载和渲染的情况。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2011-08-28
          • 2013-09-28
          • 2016-02-23
          • 2016-03-21
          • 2012-10-28
          • 2011-03-01
          • 2010-12-20
          • 2012-05-15
          • 2011-06-10
          相关资源
          最近更新 更多