Django Tutorial Part 4: User Profiles and Permissions (2025 Beginner Guide)
In Part 3, we added login, logout, and user registration. Now in Part 4, you'll learn how to create a custom user profile and assign permissions or roles using Django’s powerful auth system.
What You’ll Learn
- Create a profile model linked to the user
- Assign and check user permissions
- Display profile info in templates
Step 1: Create the Profile Model
Create a profile model inmodels.py:
from django.db import models
from django.contrib.auth.models import User
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
bio = models.TextField(blank=True)
profile_pic = models.ImageField(upload_to='profiles/', blank=True)
def __str__(self):
return f"{self.user.username} Profile"
Then run:
python manage.py makemigrations
python manage.py migrate
Step 2: Auto-Create Profile After Registration
Insignals.py inside your app:
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
Then connect the signals in apps.py:
def ready(self):
import myapp.signals
Step 3: Display Profile Information
Create a view inviews.py:
from django.contrib.auth.decorators import login_required
@login_required
def profile(request):
return render(request, 'myapp/profile.html')
Add URL in urls.py:
path('profile/', views.profile, name='profile'),
Create templates/myapp/profile.html:
<h2>Welcome {{ user.username }}</h2>
<p>Bio: {{ user.profile.bio }}</p>
<img src="{{ user.profile.profile_pic.url }}" alt="Profile Picture" />
Step 4: Add and Check Permissions
Django supports groups and permissions. In the admin panel:- Create a group (e.g. “Editors”)
- Assign specific permissions (e.g. can add/change Post)
- Add users to the group
if request.user.has_perm('myapp.change_post'):
# allow edit
else:
return HttpResponse("You don't have permission.")
Optional: Restrict Templates Based on Group
{% if user.groups.all.0.name == 'Editors' %}
<a href="{% url 'create_post' %}">New Post</a>
{% endif %}
Conclusion
Now you’ve extended Django's default User model by adding a profile and used the built-in permission system to control access. This sets you up to build dashboards, admin tools, or user roles for different types of users. Next up in Part 5: Build a blog-style dashboard and let users manage their own content.
django user authentication
django user profile
django permissions
django extend user model
django custom profile
django tutorial part 4
django user roles
django permission system
django profile form
django beginner permissions
django user type
django user groups
django access control
django profile model
django auth groups
django custom fields user
django django.contrib.auth
django profile page
django user attributes
django custom user