I created a custom group in Django's admin site.
In my code, I want to check if a user is in this group. How do I do that?
You can access the groups simply through the groups
attribute on 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
then user.groups.all()
returns [<Group: Editor>]
.
Alternatively, and more directly, you can check if a a user is in a group by:
if django_user.groups.filter(name = groupname).exists():
...
Note that groupname
can also be the actual Django Group object.
Your User object is linked to the Group object through a ManyToMany relationship.
You can thereby apply the filter method to user.groups.
So, to check if a given User is in a certain group ("Member" for the example), just do this :
def is_member(user):
return user.groups.filter(name='Member').exists()
If you want to check if a given user belongs to more than one given groups, use the __in operator like so :
def is_in_multiple_groups(user):
return user.groups.filter(name__in=['group1', 'group2']).exists()
Note that those functions can be used with the @user_passes_test decorator to manage access to your views :
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
Hope this help
I have similar situation, I wanted to test if the user is in a certain group. So, I've created new file utils.py where I put all my small utilities that help me through entire application. There, I've have this definition:
utils.py
def is_company_admin(user):
return user.groups.filter(name='company_admin').exists()
so basically I am testing if the user is in the group company_admin and for clarity I've called this function is_company_admin.
When I want to check if the user is in the company_admin I just do this:
views.py
from .utils import *
if is_company_admin(request.user):
data = Company.objects.all().filter(id=request.user.company.id)
Now, if you wish to test same in your template, you can add is_user_admin in your context, something like this:
views.py
return render(request, 'admin/users.html', {'data': data, 'is_company_admin': is_company_admin(request.user)})
Now you can evaluate you response in a template:
users.html
{% if is_company_admin %}
... do something ...
{% endif %}
Simple and clean solution, based on answers that can be found earlier in this thread, but done differently. Hope it will help someone.
Tested in Django 3.0.4.
Just in case if you wanna check user's group belongs to a predefined group list:
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
I have done it the following way. Seems inefficient but I had no other way in my mind:
@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')
I did it like this. For group named 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)
template
# index.html
{% if is_editor %}
<h1>Editor tools</h1>
{% endif %}