in_group template filter

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
@register.filter
def in_group(user, groups):
    """Returns a boolean if the user is in the given group, or comma-separated
    list of groups.

    Usage::

        {% if user|in_group:"Friends" %}
        ...
        {% endif %}

    or::

        {% if user|in_group:"Friends,Enemies" %}
        ...
        {% endif %}

    """
    group_list = force_unicode(groups).split(',')
    return bool(user.groups.filter(name__in=group_list).values('name'))

More like this

  1. Check Group Membership Filter by Mogga 4 years, 10 months ago
  2. BeforeFilter Middleware by david 4 years, 3 months ago
  3. Choice Field and Select Widget With Optional Optgroups by leahculver 6 years ago
  4. True Unique Boolean Model Decorator by kunitoki 1 year ago
  5. User groups template tag by hijinks 3 years, 11 months ago

Comments

dnordberg (on July 3, 2008):

maybe you could use user.groups.values('name') just to make it more efficient

#

whiteinge (on July 3, 2008):

Thanks, good improvement:

return group in [g['name'] for g in user.groups.values('name')]

#

Mogga (on July 18, 2008):

made a few mods so it can accept multiple group names... here it is -> 895

#

whiteinge (on July 19, 2008):

To check if a user is in a comma-separated list of groups just change the last line to the following (it is slightly less efficient than just checking one group):

return bool(user.groups.filter(name__in=groups.split(',')).values('name'))

#

whiteinge (on July 19, 2008):

Just re-ran the speed tests and I was mistaken -- there is virtual no performance difference, so I updated the main snippet. Thanks for the idea.

#

andrea (on December 11, 2010):

awesomeness. and for the n00bs like me, don't forget to import force_unicode:

from django.utils.encoding import force_unicode

#

saundersmatt (on October 19, 2011):

This filter gives an error in Django 1.3.

Wrapping it with if user.is_authenticated(): fixes the problem.

#

seafangs (on September 3, 2012):

This snippet is extremely useful, but saundersmatt is right. I recommend replacing the last two lines of the snippet with this:

if user.is_authenticated():
    group_list = force_unicode(groups).split(',')
    return bool(user.groups.filter(name__in=group_list).values('name'))
else:
    return False

#

(Forgotten your password?)