In Django, how do I check if a user is in a certain group?

前端 未结 12 1909
借酒劲吻你
借酒劲吻你 2020-11-28 18:25

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?

相关标签:
12条回答
  • 2020-11-28 18:30

    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

    0 讨论(0)
  • 2020-11-28 18:33

    If you don't need the user instance on site (as I did), you can do it with

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

    This will produce only one request to the database and return a boolean.

    0 讨论(0)
  • 2020-11-28 18:35

    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')
    
    0 讨论(0)
  • 2020-11-28 18:37

    If a user belongs to a certain group or not, can be checked in django templates using:

    {% if group in request.user.groups.all %} "some action" {% endif %}

    0 讨论(0)
  • 2020-11-28 18:38

    If you need the list of users that are in a group, you can do this instead:

    from django.contrib.auth.models import Group
    users_in_group = Group.objects.get(name="group name").user_set.all()
    

    and then check

     if user in users_in_group:
         # do something
    

    to check if the user is in the group.

    0 讨论(0)
  • 2020-11-28 18:45

    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.

    0 讨论(0)
提交回复
热议问题