在Django中,如何检查用户是否在某个组中?
我在Django的pipe理站点中创build了一个自定义组。
在我的代码中,我想检查用户是否在这个组中。 我怎么做?
您只需通过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>]
您的用户对象通过ManyToMany关系链接到组对象。
您可以从而将filter方法应用于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装饰器一起使用,以pipe理对视图的访问:
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
希望这个帮助
如果您需要组中的用户列表,则可以这样做:
from django.contrib.auth.models import Group users_in_group = Group.objects.get(name="group name").user_set.all()
然后检查
if user in users_in_group: # do something
检查用户是否在组中。
如果你不需要现场的用户实例(就像我一样),你可以做到这一点
User.objects.filter(pk=userId, groups__name='Editor').exists()
这将只对数据库产生一个请求并返回一个布尔值。
如果用户属于某个组,可以使用以下命令在django模板中进行检查:
{% if group in request.user.groups.all %}
"some action"
{% endif %}
你只需要一行:
from django.contrib.auth.decorators import user_passes_test @user_passes_test(lambda u: u.groups.filter(name='companyGroup').exists()) def you_view(): return HttpResponse("Since you're logged in, you can see this text!")
以防万一,如果你想检查用户的组属于一个预定义的组列表:
def is_allowed(user): allowed_group = set(['admin', 'lead', 'manager']) usr = User.objects.get(username=user) groups = [ x.name for x in usr.groups.all()] if allowed_group.intersection(set(groups)): return True return False
在一行中:
'Groupname' in user.groups.values_list('name', flat=True)
这是评估为True
或False
。