在Django中,如何检查用户是否在某个组中?

195 投票
13 回答
178713 浏览
提问于 2025-04-16 10:33

我在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

对于基于类的视图,你可以使用UserPassesTestMixintest_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

你可以通过 Usergroups 属性来简单地访问用户的组。

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 组对象。

撰写回答