django - Django admin 以多对多关系显示表中的所有记录,而不是相关字段
问题描述
所以在这个项目中有组织。每个用户都可以是多个组织中的经理。每个用户也可以是多个组织的成员。
当我进入 django admin 中的“用户页面”时(例如,我点击用户而不是点击该用户),我希望看到一个用户是经理的组织列表,以及另一个用户是成员的组织列表.
相反,对于任何用户,我都会在管理和成员列表中看到所有组织的列表,如下图所示。例如,列表不按他们的用户 ID 过滤。
我做错了什么?我怎样才能解决这个问题?谢谢。
我的 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)
...
解决方案
这只是 Django 管理员默认显示 m2m 字段的一种方式。您会看到整个组织表,并且您可以通过在按住 Control/Command 的同时选择行来选择用户所属的组织(如框下方所示)。
但是,使用多选框可能不方便。有一个选项filter_horizontal
提供替代 UX(还有一个filter_vertical
)。文档
@admin.register(User)
class UserAdmin(auth_admin.UserAdmin):
...
filter_horizontal = ('managerships', 'memberships')
您仍然会在左侧看到整个组织表,而选定的组织将显示在右侧。
推荐阅读
- c++ - c ++互斥锁不会从内部阻止代码,但允许从外部阻止它
- azure-log-analytics - Azure Sentinel - 如何将 ESET 日志获取到 eset_CL
- python - 使用 Django 在页面加载之间保持文件内容
- c++ - 访问向量内、另一个对象内、超出范围的对象成员
- javascript - 无法通过 https 读取未定义的属性“getusermedia”
- java - JTextArea 参数和用户输入问题
- python - 在 FastAPI 中只初始化一次繁重服务的最佳方法
- parallel-processing - cuda 中有 atomicMul() 吗?
- node.js - 无需太多配置即可集成测试节点服务器
- php - PHP-FPM fastcgi_finish_request() 调用由于未知原因清除变量