在Django Admin中使用UserProfile字段过滤用户列表
我正在尝试在Django中使用用户资料字段来过滤用户列表……我需要实现一个排队系统,让新用户在管理员批准之前先排队。
我简单地在我的用户资料模型中添加了一个 is_in_queue
的布尔字段……但是,当我在管理员区域显示用户列表时,我发现不能通过模型的外键字段(在这个例子中是用户资料的字段)来过滤列表。
显然,list_display
项目可以是可调用的,但 list_filter
不能,所以我可以列出用户是否在排队没有问题,但管理员必须滚动整个用户列表才能找到哪些用户在排队,这样做没有意义……只过滤那些在排队的用户(使用 userprofile.in_queue)会更实用……
最后,我考虑在我的管理员区域添加一个自定义视图,只列出在排队的用户,但那个自定义视图在管理员区域的首页上并没有显示,而且为了一个新的过滤选项而重新搭建一个完整的AdminSite似乎有点过于复杂……
所以简单总结一下:我可以根据用户资料字段来过滤我的用户列表吗?如果不行,我能否添加一个可以从首页访问的自定义视图,而不必为此创建一个全新的AdminSite?
3 个回答
听起来最快最简单的办法就是为你的应用添加一个新的管理员视图,专门用来管理你自定义的用户模型。你可以查看一下Django的管理员文档,不过看起来你已经知道怎么使用管理员界面了。
一旦管理员页面专门针对你的模型,所有你自定义的字段就不再是外键了。这样过滤数据就变得简单多了。
Django 1.3 解决了这个问题 - 现在 list_filter 可以跨越关系进行过滤了:
https://docs.djangoproject.com/en/1.3/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter
你可能想看看如何为你的模型的 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 的文档,搜索“自定义管理器”来进一步了解这个内容。