Django Tutorial Part 4: User Profiles and Permissions (2025 Beginner Guide)

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 in models.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

In signals.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 in views.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:
  1. Create a group (e.g. “Editors”)
  2. Assign specific permissions (e.g. can add/change Post)
  3. Add users to the group
Check permissions in a view:
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.