首页 > 解决方案 > Django admin 以多对多关系显示表中的所有记录,而不是相关字段

问题描述

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

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

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

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

Django 管理员截图

我的 UserAdmin 就像:

@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)
    ...

标签: djangodjango-admin

解决方案


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

但是,使用多选框可能不方便。有一个选项filter_horizontal提供替代 UX(还有一个filter_vertical)。文档

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

您仍然会在左侧看到整个组织表,而选定的组织将显示在右侧。


推荐阅读