在Django中,如何检查用户是否在某个组中?
我在Django的管理网站上创建了一个自定义的用户组。
在我的代码里,我想检查一个用户是否在这个组里。我该怎么做呢?
13 个回答
20
如果你不需要在网站上使用用户实例(就像我一样),你可以这样做:
User.objects.filter(pk=userId, groups__name='Editor').exists()
这样只会向数据库发送一次请求,并返回一个布尔值。
274
你的User对象和Group对象之间是通过多对多的关系连接起来的。
因此,你可以对user.groups使用过滤方法。
所以,要检查某个用户是否在特定的组里(比如“成员”这个例子),你只需要这样做:
def is_member(user):
return user.groups.filter(name='Member').exists()
如果你想检查某个用户是否属于多个特定的组,可以使用__in操作符,像这样:
def is_in_multiple_groups(user):
return user.groups.filter(name__in=['group1', 'group2']).exists()
注意,这些功能可以和@user_passes_test装饰器一起使用,以管理你视图的访问权限:
from django.contrib.auth.decorators import login_required, user_passes_test
@login_required
@user_passes_test(is_member) # or @user_passes_test(is_in_multiple_groups)
def myview(request):
# Do your processing
对于基于类的视图,你可以使用UserPassesTestMixin
和test_func
方法:
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
class MyView(LoginRequiredMixin, UserPassesTestMixin, View):
login_url = '/login/'
redirect_field_name = 'redirect_to'
def test_func(self):
return is_member(self.request.user)
希望这对你有帮助
145
你可以通过 User
的 groups
属性来简单地访问用户的组。
from django.contrib.auth.models import User, Group
group = Group(name = "Editor")
group.save() # save this new group for this example
user = User.objects.get(pk = 1) # assuming, there is one initial user
user.groups.add(group) # user is now in the "Editor" group
然后 user.groups.all()
会返回 [<Group: Editor>]
,这表示用户属于“编辑”组。
另外,你也可以更直接地检查一个用户是否在某个组里,方法是:
if django_user.groups.filter(name = groupname).exists():
...
注意,groupname
也可以是实际的 Django 组对象。