Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Custom Permissions in Django
📖 Scenario: You are building a Django web app where only certain users can edit articles. You want to create a custom permission to control who can update articles.
🎯 Goal: Create a custom permission called can_edit_article and apply it to an Article model. Then check this permission in a view to allow or deny editing.
📋 What You'll Learn
Create an Article model with a title and content fields
Add a custom permission can_edit_article to the Article model
Create a variable user_can_edit that checks if a user has the can_edit_article permission
Use the permission check in a view function to allow editing only if user_can_edit is True
💡 Why This Matters
🌍 Real World
Custom permissions help control who can do what in your web app, like letting only editors update articles.
💼 Career
Understanding custom permissions is important for building secure Django apps and is a common task for backend developers.
Progress0 / 4 steps
1
Create the Article model
Create a Django model called Article with two fields: title as a CharField with max length 100, and content as a TextField.
Django
Hint
Use models.CharField for short text and models.TextField for longer text.
2
Add a custom permission to the Article model
Add a Meta class inside the Article model. Inside Meta, add a permissions list with a tuple ("can_edit_article", "Can edit article").
Django
Hint
The permissions attribute is a list of tuples inside the Meta class.
3
Check the custom permission in a variable
Create a variable called user_can_edit that checks if a user has the permission "app_label.can_edit_article". Use user.has_perm("app_label.can_edit_article"). Replace app_label with the app name blog.
Django
Hint
Use the exact string "blog.can_edit_article" inside has_perm().
4
Use the permission check in a view
In a Django view function called edit_article, use an if statement to check user_can_edit. If True, return HttpResponse("Edit allowed"). Otherwise, return HttpResponseForbidden(). Import HttpResponse and HttpResponseForbidden from django.http.
Django
Hint
Use if user_can_edit: to check permission and return the correct response.
Practice
(1/5)
1. What is the main purpose of creating a custom permission in Django?
easy
A. To control user access based on specific rules you define
B. To change the database schema automatically
C. To speed up the Django server response time
D. To create new database tables for users
Solution
Step 1: Understand what permissions do in Django
Permissions control what users can or cannot do in the app.
Step 2: Identify the role of custom permissions
Custom permissions let you define your own rules for user access beyond default ones.
Final Answer:
To control user access based on specific rules you define -> Option A
Quick Check:
Custom permissions = control user access [OK]
Hint: Custom permissions control access rules you create [OK]
Common Mistakes:
Thinking permissions change database structure
Confusing permissions with performance settings
Believing permissions create new tables
2. Which method must you override when creating a custom permission class in Django REST Framework?
easy
A. save
B. get_queryset
C. has_permission
D. dispatch
Solution
Step 1: Recall the BasePermission class methods
The main method to check access is has_permission.
Step 2: Confirm which method controls permission checks
has_permission returns True or False to allow or deny access.
Final Answer:
has_permission -> Option C
Quick Check:
Permission check method = has_permission [OK]
Hint: Override has_permission to define access rules [OK]
Common Mistakes:
Using get_queryset which filters data, not permissions
Confusing save method with permission checks
Using dispatch which is for request handling
3. Given this custom permission class, what will be the result if a user is not authenticated?
from rest_framework.permissions import BasePermission
class IsAuthenticatedCustom(BasePermission):
def has_permission(self, request, view):
return request.user and request.user.is_authenticated
medium
A. Code raises an error due to missing return
B. Access is denied because user is not authenticated
C. Access is granted regardless of authentication
D. Access is granted only if user is staff
Solution
Step 1: Analyze the has_permission method logic
It returns True only if request.user exists and is authenticated.
Step 2: Consider the case when user is not authenticated
Then request.user.is_authenticated is False, so method returns False denying access.
Final Answer:
Access is denied because user is not authenticated -> Option B
Quick Check:
Unauthenticated user = access denied [OK]
Hint: Check if user.is_authenticated is True to allow access [OK]
Common Mistakes:
Assuming access is granted without authentication
Thinking code raises error due to return statement
Confusing staff status with authentication
4. Identify the error in this custom permission class:
from rest_framework.permissions import BasePermission
class IsOwnerPermission(BasePermission):
def has_permission(self, request, view):
return request.user == view.get_object().owner
medium
A. Missing import for request module
B. No return statement in has_permission
C. Incorrect comparison operator used
D. Using has_permission instead of has_object_permission for object check
Solution
Step 1: Understand permission methods roles
has_permission checks general access; has_object_permission checks per object.
Step 2: Identify misuse of has_permission for object ownership
Comparing user to object owner requires has_object_permission, not has_permission.
Final Answer:
Using has_permission instead of has_object_permission for object check -> Option D
Quick Check:
Object checks need has_object_permission [OK]
Hint: Use has_object_permission for per-object access checks [OK]
Common Mistakes:
Confusing has_permission with has_object_permission
Assuming import errors cause this issue
Thinking comparison operator is wrong
5. You want to create a custom permission that allows access only if the user is authenticated and the HTTP method is safe (GET, HEAD, OPTIONS). Which is the correct implementation?
hard
A. class SafeAndAuthenticated(BasePermission):
def has_permission(self, request, view):
return request.user.is_authenticated and request.method in ['GET', 'HEAD', 'OPTIONS']
B. class SafeAndAuthenticated(BasePermission):
def has_permission(self, request, view):
return request.user.is_authenticated or request.method in ['GET', 'HEAD', 'OPTIONS']
C. class SafeAndAuthenticated(BasePermission):
def has_permission(self, request, view):
return not request.user.is_authenticated and request.method in ['GET', 'HEAD', 'OPTIONS']
D. class SafeAndAuthenticated(BasePermission):
def has_permission(self, request, view):
return request.user.is_authenticated and request.method not in ['GET', 'HEAD', 'OPTIONS']
Solution
Step 1: Understand the requirement
User must be authenticated AND method must be safe (GET, HEAD, OPTIONS).
Step 2: Analyze each option's logic
class SafeAndAuthenticated(BasePermission):
def has_permission(self, request, view):
return request.user.is_authenticated and request.method in ['GET', 'HEAD', 'OPTIONS'] uses AND with correct method list; others use OR, NOT, or wrong method checks.
Final Answer:
class SafeAndAuthenticated(BasePermission):
def has_permission(self, request, view):
return request.user.is_authenticated and request.method in ['GET', 'HEAD', 'OPTIONS'] -> Option A
Quick Check:
Use AND for combined conditions [OK]
Hint: Use AND to combine authentication and method checks [OK]