python - vincent - En Django, ¿cómo puedo verificar si un usuario está en cierto grupo?
register and login django (10)
En una línea:
''Groupname'' in user.groups.values_list(''name'', flat=True)
Esto se evalúa como True
o False
.
Creé un grupo personalizado en el sitio de administración de Django.
En mi código, quiero verificar si un usuario está en este grupo. ¿Cómo puedo hacer eso?
Lo he hecho de la siguiente manera. Parece ineficiente pero no tenía otra forma en mi mente:
@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'')
Por si acaso, si desea verificar que el grupo de usuarios pertenece a una lista de grupos predefinida:
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
Si necesita la lista de usuarios que están en un grupo, puede hacer esto en su lugar:
from django.contrib.auth.models import Group
users_in_group = Group.objects.get(name="group name").user_set.all()
y luego verificar
if user in users_in_group:
# do something
para verificar si el usuario está en el grupo.
Si no necesita la instancia del usuario en el sitio (como yo lo hice), puede hacerlo con
User.objects.filter(pk=userId, groups__name=''Editor'').exists()
Esto producirá solo una solicitud a la base de datos y devolverá un booleano.
Si un usuario pertenece a un determinado grupo o no, se puede verificar en plantillas django utilizando:
{% if group in request.user.groups.all %}
"some action"
{% endif %}
Solo necesitas una línea:
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!")
Su objeto Usuario está vinculado al objeto Grupo a través de una relación ManyToMany .
De este modo, puede aplicar el método de filtro a user.groups .
Entonces, para verificar si un Usuario dado está en un grupo determinado ("Miembro" para el ejemplo), simplemente haga esto:
def is_member(user):
return user.groups.filter(name=''Member'').exists()
Si desea verificar si un usuario dado pertenece a más de un grupo determinado, use el operador __in de la siguiente manera:
def is_in_multiple_groups(user):
return user.groups.filter(name__in=[''group1'', ''group2'']).exists()
Tenga en cuenta que esas funciones se pueden usar con @user_passes_test decorator para administrar el acceso a sus vistas:
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
Espero que esto ayude
User.objects.filter (username = ''tom'', groups__name = ''admin''). Exists ()
Esa consulta le informará al usuario: "tom" si pertenece al grupo "admin" o no
Puede acceder a los grupos simplemente a través del atributo de groups
en User
.
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
luego user.groups.all()
devuelve [<Group: Editor>]