Django 管理员:list_editable 中的ManyToManyField?

Ric*_*ard 5 django many-to-many django-admin

在 Django 管理中,我真的希望能够在列表显示中显示可编辑的 ManyToManyField。

它不一定需要是完整的 ManyToManyField 控件 - 能够仅保存一个值就足以满足列表显示的目的(尽管底层值本质上是多对多)。

我的模型如下所示:

class Item(models.Model):
    name = models.CharField(max_length=500)
    colour = models.ManyToManyField(Colour, related_name='primary_colour')
Run Code Online (Sandbox Code Playgroud)

如果我尝试这样做admin.py

class ItemAdmin(admin.ModelAdmin):
    list_display = ('name', 'colour')
    list_editable = ('colour')
Run Code Online (Sandbox Code Playgroud)

然后我得到这个错误:

'ItemAdmin.list_display[6]', 'colour' is a ManyToManyField which is not supported.
Run Code Online (Sandbox Code Playgroud)

什么方法可以显示可编辑的 ManyToManyField 以便在列表显示中快速编辑吗?

我发现了这个相关问题,它解释了如何使值在列表显示中可见,但不可编辑:ManyToManyField widget in a django admin change list?

Hed*_*ide 1

您可以轻松地将自定义视图添加到管理网址并添加所需的 html/javascript/ajax。基础知识如下:

class ItemAdmin(admin.ModelAdmin):
    # regular stuff

    def render_foo(self, obj):
        # add this to your list_display
        html = '<stuff><input/submit action></stuff>'
        return mark_safe(html)

    def get_urls(self):
        urls = super(ItemAdmin, self).get_urls()
        extra_urls = patterns('',
            (r'^process_foo/$', self.admin_site.admin_view(self.process_foo)),
        )
        return extra_urls + urls

    def process_foo(self, request):
        if not request.is_ajax():
            raise Http404
        foo = request.GET.get("attr")
        # process m2m
        # return some json
Run Code Online (Sandbox Code Playgroud)