Django admin 以多对多关系显示 table 中的所有记录,而不是相关字段

Django admin shows all the records in the table in a many to many relationship, instead of related fields

所以在这个项目中有组织。每个用户都可以是多个组织中的经理。每个用户也可以是多个组织的成员。

当我转到 django admin 中的“用户页面”时(例如,我单击用户而不是单击该用户),我希望看到一个组织列表,该用户是经理,以及另一个组织列表该用户是会员。

相反,对于任何用户,我都会在管理和成员列表中看到所有组织的列表,如下图所示。例如。该列表未按用户 ID 过滤。

我做错了什么?我怎样才能解决这个问题?谢谢。

我的用户管理员是这样的:

@admin.register(User)
class UserAdmin(auth_admin.UserAdmin):

    form = UserChangeForm
    add_form = UserCreationForm
    fieldsets = (
        ...
        (_("Managerships"), {"fields": ("managerships", )}),
        (_("Memberships"), {"fields": ("memberships", )}),

    )
    list_display = ["username", "name", "is_superuser"]
    search_fields = ["name"]

我的用户模型是这样的:

class User(AbstractUser):
    ...
    managerships = models.ManyToManyField(Organization, related_name='managerships',blank=True)
    memberships  = models.ManyToManyField(Organization,  related_name='memberships',blank=True)
    ...

组织模型如下:

class Organization(models.Model):
    name = models.CharField(max_length=200)
    ...

这只是 Django 管理员默认显示 m2m 字段的一种方式。您会看到整个组织 table,并且您可以 select 通过在按住 Control/Command 的同时对行进行 select 来 select 用户所属的组织(如框下方所写)。

不过,使用多个-select框可能不方便。有一个选项 filter_horizontal 提供替代 UX(还有一个 filter_vertical)。 Docs

@admin.register(User)
class UserAdmin(auth_admin.UserAdmin):
    ...
    filter_horizontal = ('managerships', 'memberships')

您仍然会在左侧看到整个组织 table,selected 组织将显示在右侧。