在Django Admin中使用UserProfile字段过滤用户列表

5 投票
3 回答
3620 浏览
提问于 2025-04-15 15:17

我正在尝试在Django中使用用户资料字段来过滤用户列表……我需要实现一个排队系统,让新用户在管理员批准之前先排队。

我简单地在我的用户资料模型中添加了一个 is_in_queue 的布尔字段……但是,当我在管理员区域显示用户列表时,我发现不能通过模型的外键字段(在这个例子中是用户资料的字段)来过滤列表。

显然,list_display 项目可以是可调用的,但 list_filter 不能,所以我可以列出用户是否在排队没有问题,但管理员必须滚动整个用户列表才能找到哪些用户在排队,这样做没有意义……只过滤那些在排队的用户(使用 userprofile.in_queue)会更实用……

最后,我考虑在我的管理员区域添加一个自定义视图,只列出在排队的用户,但那个自定义视图在管理员区域的首页上并没有显示,而且为了一个新的过滤选项而重新搭建一个完整的AdminSite似乎有点过于复杂……

所以简单总结一下:我可以根据用户资料字段来过滤我的用户列表吗?如果不行,我能否添加一个可以从首页访问的自定义视图,而不必为此创建一个全新的AdminSite?

3 个回答

0

听起来最快最简单的办法就是为你的应用添加一个新的管理员视图,专门用来管理你自定义的用户模型。你可以查看一下Django的管理员文档,不过看起来你已经知道怎么使用管理员界面了。

一旦管理员页面专门针对你的模型,所有你自定义的字段就不再是外键了。这样过滤数据就变得简单多了。

3

Django 1.3 解决了这个问题 - 现在 list_filter 可以跨越关系进行过滤了:

https://docs.djangoproject.com/en/1.3/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter

1

你可能想看看如何为你的模型的 admin_objects 使用一个自定义管理器。

class UserAdminManager(models.AdminManager):
"""
Custom manager for the User model.
"""
def get_query_set(self):
    """
    Overwrites the get_query_set to only return Users in the queue.
    """
    return super(UserAdminManager, self).get_query_set().filter(userprofile__queue=True)

通过重写 get_query_set 方法,你可以对结果进行筛选。然后只需将这个结果赋值给你的 User 模型的 admin_objects 属性。

admin_objects = UserAdminManager()

我举的例子中的一些属性名称可能不太准确,因为我不了解你的模型设置,但希望你能明白这个意思。

你可以通过查阅 Django 的文档,搜索“自定义管理器”来进一步了解这个内容。

撰写回答