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

Python 在Django中,如何检查用户是否在某个组中?,python,django,django-authentication,Python,Django,Django Authentication,我在Django的管理站点中创建了一个自定义组 在我的代码中,我想检查用户是否在此组中。如何操作?您可以通过User上的groups属性访问这些组 来自django.contrib.auth.models导入用户组 组=组(name=“Editor”) group.save()#为本例保存此新组 user=user.objects.get(pk=1)#假设有一个初始用户 user.groups.add(group)#用户现在在“Editor”组中 然后user.groups.all()返回[]

我在Django的管理站点中创建了一个自定义组


在我的代码中,我想检查用户是否在此组中。如何操作?

您可以通过
User
上的
groups
属性访问这些组

来自django.contrib.auth.models导入用户组
组=组(name=“Editor”)
group.save()#为本例保存此新组
user=user.objects.get(pk=1)#假设有一个初始用户
user.groups.add(group)#用户现在在“Editor”组中
然后
user.groups.all()
返回
[]

或者,更直接地,您可以通过以下方式检查用户是否在组中:

如果django\u user.groups.filter(name=groupname.exists():
...

请注意,
groupname
也可以是实际的Django组对象。

如果您需要组中的用户列表,您可以这样做:

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

检查用户是否在组中。

如果要检查用户的组是否属于预定义的组列表,请执行以下操作:

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

您的用户对象通过多个关系链接到对象

因此,您可以将过滤器方法应用于用户组

因此,要检查给定用户是否在某个组中(例如“成员”),只需执行以下操作:

def is_member(user):
    return user.groups.filter(name='Member').exists()
如果要检查给定用户是否属于多个给定组,请使用中的\u操作符,如下所示:

def is_in_multiple_groups(user):
    return user.groups.filter(name__in=['group1', 'group2']).exists()
请注意,这些功能可与@user\u passes\u 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
希望这对您有所帮助

一行:

'Groupname' in user.groups.values_list('name', flat=True)
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!")

计算结果为
True
False

您只需要一行:

'Groupname' in user.groups.values_list('name', flat=True)
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!")

如果您不需要站点上的用户实例(如我所做的),您可以使用

User.objects.filter(pk=userId, groups__name='Editor').exists()

这将只向数据库生成一个请求并返回一个布尔值。

如果用户是否属于某个组,可以使用以下方法在django模板中进行检查:

{%if组位于request.user.groups.all%}
“一些动作”

{%endif%}

我用下面的方法做了。似乎效率不高,但我没有其他办法:

@login_required
def list_track(request):

usergroup = request.user.groups.values_list('name', flat=True).first()
if usergroup in 'appAdmin':
    tracks = QuestionTrack.objects.order_by('pk')
    return render(request, 'cmit/appadmin/list_track.html', {'tracks': tracks})

else:
    return HttpResponseRedirect('/cmit/loggedin')
User.objects.filter(username='tom',groups\uu name='admin').exists()


该查询将通知用户:“tom”是否属于组“admin”

我就是这样做的。对于名为
编辑器的组

# views.py
def index(request):
    current_user_groups = request.user.groups.values_list("name", flat=True)
    context = {
        "is_editor": "Editor" in current_user_groups,
    }
    return render(request, "index.html", context)
模板

# index.html
{% if is_editor %}
  <h1>Editor tools</h1>
{% endif %}
#index.html
{%if是_编辑器%}
编辑工具
{%endif%}

我有类似的情况,我想测试用户是否在某个组中。所以,我创建了一个新文件utils.py,在其中我放置了所有帮助我完成整个应用程序的小实用程序。在这里,我有这样的定义:

utils.py

def is_company_admin(user):
    return user.groups.filter(name='company_admin').exists()
因此,基本上我正在测试用户是否在组公司管理中,为了清楚起见,我将此函数称为是公司管理

当我想检查用户是否在公司管理中时,我只需执行以下操作:

views.py

from .utils import *

if is_company_admin(request.user):
        data = Company.objects.all().filter(id=request.user.company.id)
现在,如果希望在模板中测试相同的内容,可以在上下文中添加is\u user\u admin,如下所示:

views.py

return render(request, 'admin/users.html', {'data': data, 'is_company_admin': is_company_admin(request.user)})
现在,您可以在模板中评估您的响应:

users.html

{% if is_company_admin %}
     ... do something ...
{% endif %}

简单而干净的解决方案,基于本主题前面的答案,但操作方式不同。希望它能帮助别人

在Django 3.0.4中进行测试。

使用以下方法:

{% for group in request.user.groups.all %}
    {% if group.name == 'GroupName' %}
    {% endif %}
{% endfor %}

如果user.groups.filter(name=group_name.count():#做点什么或使用.exists()而不是.count(),那么实际的检查将是
。问题是查询用户模型以查找它所属的组,而不是如何实例化'em…--对于用户数超过少数的站点来说,这无法很好地扩展,因为每次运行时,它都会将大型子集用户表加载到内存中。
user.groups.filter(name=“group name”).exists()
应该可以正常工作。您编写的解决方案使用了两个查询,因此不是很理想。正如它所说,“如果您需要组中的用户列表”…我不确定django的DB access的内部工作方式,但这似乎比其他一些建议更有效,例如,将所有用户放入一个组中,并在组中执行标准的python
用户操作(反之亦然)。您不需要在末尾添加
.exists()
以返回布尔值吗?否则,
is_member()
is_in_multiple_groups()
将返回一个
QuerySet
,这可能不会给出所需的结果。根据Django的文档,使用exists()确实更快,因为它不会计算QuerySet:您可能希望超级用户通过测试(不查询数据库):
def is_成员(用户):返回user.is_超级用户或user.groups.filter(…
是多个组中的一员
可以更明确地命名为
是某些组中的一员
,因为它不要求用户是所有组中的一员这是低效的,因为它将获取更多的数据,然后在django一侧对其进行操作。最好使用
.exists()
让db来完成这项工作。虽然代码不是很干净,也不是很可重用,但将其放在一行中需要+1。这对我来说不起作用,似乎需要将组与组名称进行比较。在
data=Company.objects.all()过滤器(id=request.user.Company.id)中使用双下划线的groups\u name
,公司意味着什么?那是你的模型吗?是的@hayden,在这种情况下,公司就是我的模型。