0
0
DjangoHow-ToBeginner · 4 min read

How to Use Groups and Permissions in Django for Access Control

In Django, use Group to organize users and assign Permission objects to control access. Add users to groups and check permissions with built-in methods like user.has_perm() to manage authorization easily.
📐

Syntax

Django provides Group and Permission models in django.contrib.auth.models. You create groups, assign permissions to them, and add users to groups. Use user.has_perm('app_label.permission_codename') to check if a user has a specific permission.

Key parts:

  • Group.objects.create(name='group_name'): Create a new group.
  • group.permissions.add(permission): Assign permissions to a group.
  • user.groups.add(group): Add a user to a group.
  • user.has_perm('app_label.permission_codename'): Check if user has permission.
python
from django.contrib.auth.models import Group, Permission, User

# Create a group
editors = Group.objects.create(name='Editors')

# Get a permission
permission = Permission.objects.get(codename='change_article')

# Assign permission to group
editors.permissions.add(permission)

# Add user to group
user = User.objects.get(username='alice')
user.groups.add(editors)

# Check permission
user.has_perm('app.change_article')  # Returns True or False
💻

Example

This example shows how to create a group called 'Editors', assign the permission to change articles, add a user to this group, and check if the user has the permission.

python
from django.contrib.auth.models import Group, Permission, User

# Create group
editors, created = Group.objects.get_or_create(name='Editors')

# Get permission to change article
change_article_perm = Permission.objects.get(codename='change_article')

# Add permission to group
editors.permissions.add(change_article_perm)

# Get user
user = User.objects.get(username='alice')

# Add user to group
user.groups.add(editors)

# Save user
user.save()

# Check if user has permission
has_permission = user.has_perm('app.change_article')
print(f"User has 'change_article' permission: {has_permission}")
Output
User has 'change_article' permission: True
⚠️

Common Pitfalls

Common mistakes include:

  • Not assigning permissions to groups before adding users.
  • Forgetting to save user or group objects after changes.
  • Using incorrect permission codenames or app labels in has_perm().
  • Assuming group permissions update immediately without refreshing user permissions cache.

Always use the correct app_label.permission_codename format and reload user permissions if needed.

python
from django.contrib.auth.models import Group, Permission, User

# Wrong: Using incorrect permission codename
# user.has_perm('wrongapp.change_article')  # Will return False

# Right: Use correct app label and codename
user.has_perm('app.change_article')  # Returns True if permission assigned

# Wrong: Forgetting to add permission to group
editors = Group.objects.get(name='Editors')
# editors.permissions.add(permission)  # Missing this step causes no permission

# Right: Add permission before adding user
editors.permissions.add(permission)
user.groups.add(editors)
user.save()
📊

Quick Reference

ActionCode Example
Create a groupGroup.objects.create(name='GroupName')
Get a permissionPermission.objects.get(codename='permission_codename')
Assign permission to groupgroup.permissions.add(permission)
Add user to groupuser.groups.add(group)
Check user permissionuser.has_perm('app_label.permission_codename')

Key Takeaways

Use Django's Group model to bundle users and assign permissions collectively.
Assign permissions to groups, then add users to those groups for easy access control.
Check permissions with user.has_perm('app_label.permission_codename') to enforce authorization.
Always use correct permission codenames and app labels to avoid permission errors.
Remember to save changes and refresh user permissions if needed after updates.