在Django管理界面显示ManyToManyField为复选框

34 投票
4 回答
19941 浏览
提问于 2025-04-16 10:32

有没有简单的方法可以在Django后台把ManyToManyField显示为复选框?谢谢!

4 个回答

5

如果你想要单独修改某个字段,可以使用下面的方法:

def get_form(self, request, obj=None, **kwargs):
    form = super(VNodeAdmin, self).get_form(request, obj, **kwargs)
    form.base_fields['node_type'].widget = forms.CheckboxSelectMultiple()
    return form
7

这绝对是可以实现的。下面是你可以放在ModelAdmin子类中的代码:

def formfield_for_manytomany(self, db_field, request=None, **kwargs):
    if db_field.name == 'your field name':
        kwargs['widget'] = form_widgets.CheckboxSelectMultiple()
        kwargs['help_text'] = ''

    return db_field.formfield(**kwargs)

这个代码是通过查看管理代码得出来的。

72

根据这个回答,似乎可以使用ModelAdmin.formfield_overrides来修改ManyToManyField,让它使用CheckBoxSelectMultiple控件:

from django.db import models
from django.contrib import admin
from django.forms import CheckboxSelectMultiple

class MyModelAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.ManyToManyField: {'widget': CheckboxSelectMultiple},
    }

我还没有尝试过,只是在引用这个来源,但看起来是可行的。祝你好运。

警告:正如@errx所指出的,文档中提到了一些注意事项:

如果你想在关系字段(比如ForeignKeyManyToManyField)上使用自定义控件,请确保你没有把这个字段的名字放在raw_id_fieldsradio_fields里。

因为如果设置了raw_id_fieldsradio_fieldsformfield_overrides就无法让你更改关系字段的控件。这是因为raw_id_fieldsradio_fields本身就意味着使用了自定义控件。

撰写回答