Respuestas:
Puede acceder a los grupos simplemente a través del groups
atributo activado 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()
regresa [<Group: Editor>]
.
Alternativamente, y más directamente, puede verificar si un usuario está en un grupo:
if django_user.groups.filter(name = groupname).exists():
...
Tenga en cuenta que tambiéngroupname
puede ser el objeto real del Grupo Django.
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 dado, 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 el decorador @user_passes_test 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 in groups
(o viceversa).
.exists()
al final para devolver un booleano? De lo contrario is_member()
, y is_in_multiple_groups()
devolverá una QuerySet
, que puede no dar el resultado deseado.
def is_member(user): return user.is_superuser or user.groups.filter(...
is_in_multiple_groups
puede ser nombrado más explícitamente is_in_some_groups
ya que no requiere que el usuario sea miembro de todos los grupos
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 verifica
if user in users_in_group:
# do something
para verificar si el usuario está en el grupo.
user.groups.filter(name="group name").exists()
Debería funcionar bien. La solución que ha escrito utiliza dos consultas y, por lo tanto, no es muy óptima.
Si no necesita la instancia de 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 valor booleano.
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!")
En caso de que si desea verificar que el grupo de usuarios pertenezca 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
Tengo una situación similar, quería probar si el usuario está en un determinado grupo. Entonces, he creado un nuevo archivo utils.py donde pongo todas mis pequeñas utilidades que me ayudan a través de toda la aplicación. Ahí tengo esta definición:
utils.py
def is_company_admin(user):
return user.groups.filter(name='company_admin').exists()
así que básicamente estoy probando si el usuario está en el grupo company_admin y para mayor claridad he llamado a esta función is_company_admin .
Cuando quiero comprobar si el usuario está en el company_admin acabo de hacer esto:
views.py
from .utils import *
if is_company_admin(request.user):
data = Company.objects.all().filter(id=request.user.company.id)
Ahora, si desea probar lo mismo en su plantilla, puede agregar is_user_admin en su contexto, algo como esto:
views.py
return render(request, 'admin/users.html', {'data': data, 'is_company_admin': is_company_admin(request.user)})
Ahora puede evaluar su respuesta en una plantilla:
users.html
{% if is_company_admin %}
... do something ...
{% endif %}
Solución simple y limpia, basada en respuestas que se pueden encontrar anteriormente en este hilo, pero que se hacen de manera diferente. Espero que ayude a alguien.
Probado en Django 3.0.4.
data = Company.objects.all().filter(id=request.user.company.id)
, ¿qué significa la Compañía? ¿Es ese tu modelo?
En una línea:
'Groupname' in user.groups.values_list('name', flat=True)
Esto se evalúa como True
o False
.
.exists()
para dejar que el db haga el trabajo.
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')
Lo hice así. Para el grupo nombrado Editor
.
# 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)
modelo
# index.html
{% if is_editor %}
<h1>Editor tools</h1>
{% endif %}
if user.groups.filter(name=group_name).count(): # do something