DEV Community

Cover image for Django Authentication Made Easy: A Complete Guide to Registration, Login, and User Management
NJOKU SAMSON EBERE
NJOKU SAMSON EBERE

Posted on

Django Authentication Made Easy: A Complete Guide to Registration, Login, and User Management

Authentication is at the heart of almost every web application. Whether you're building a simple blog or a complex e-commerce platform, managing user access securely and efficiently is crucial. In this guide, we'll break down Django's authentication system to help you implement registration, login, logout, and user management seamlessly using Function-Based Views (FBVs). By the end of this tutorial, you'll have a fully functional system ready to enhance your Django projects.

Why Django for Authentication?

Django, a high-level Python web framework, offers robust, built-in tools for authentication. These tools save developers from reinventing the wheel, allowing them to focus on the unique features of their applications.

Key benefits of Django's authentication system include:

  • Prebuilt forms and views for common tasks like login and registration.
  • Easy integration with your database models.
  • Secure session and password management.

Step-by-Step Overview with Function-Based Views

1. Setting Up Your Django Project and App

First, create a new Django project and app to get started:

django-admin startproject myproject
cd myproject
python manage.py startapp accounts
Enter fullscreen mode Exit fullscreen mode

Add your app to the INSTALLED_APPS list in settings.py:

INSTALLED_APPS = [
    'accounts',
    'django.contrib.admin',
    'django.contrib.auth',
    # other apps
]
Enter fullscreen mode Exit fullscreen mode

2. User Registration with UserCreationForm

Django provides the UserCreationForm, which simplifies user registration. Here's how to create a registration view using FBVs:

views.py:

from django.shortcuts import render, redirect
from django.contrib.auth.forms import UserCreationForm

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('login')
    else:
        form = UserCreationForm()
    return render(request, 'accounts/register.html', {'form': form})
Enter fullscreen mode Exit fullscreen mode

Create a template register.html for the registration form and map the view to a URL in urls.py:

urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('register/', views.register, name='register'),
]
Enter fullscreen mode Exit fullscreen mode

3. Adding Custom Fields to Registration

Enhance the registration form by adding custom fields like email or phone_number:

forms.py:

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm

class CustomUserCreationForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = ('username', 'email', 'password1', 'password2')
Enter fullscreen mode Exit fullscreen mode

Update your registration view to use the new form:

views.py:

from .forms import CustomUserCreationForm

def register(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('login')
    else:
        form = CustomUserCreationForm()
    return render(request, 'accounts/register.html', {'form': form})
Enter fullscreen mode Exit fullscreen mode

4. Login, Logout, and Session Management

Django handles login and logout efficiently. Here's how to set them up with FBVs:

views.py:

from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render, redirect
from django.contrib import messages

# Login View
def login_view(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(request, username=username, password=password)
        if user is not None:
            login(request, user)
            return redirect('profile')
        else:
            messages.error(request, 'Invalid credentials')
    return render(request, 'accounts/login.html')

# Logout View
def logout_view(request):
    logout(request)
    return redirect('login')
Enter fullscreen mode Exit fullscreen mode

Update your urls.py:

urlpatterns = [
    path('login/', views.login_view, name='login'),
    path('logout/', views.logout_view, name='logout'),
]
Enter fullscreen mode Exit fullscreen mode

5. Custom Redirects

After login or logout, you may want to redirect users to specific pages. This can be handled in your FBVs as shown above or set globally:

settings.py:

LOGIN_REDIRECT_URL = 'profile'
LOGOUT_REDIRECT_URL = 'login'
Enter fullscreen mode Exit fullscreen mode

6. Mapping Users to Database Records

To associate users with specific database records, modify your models to include a ForeignKey or OneToOneField relationship with the User model.

models.py:

from django.contrib.auth.models import User
from django.db import models

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.TextField(blank=True)
Enter fullscreen mode Exit fullscreen mode

Use Django signals to automatically create a profile when a user registers:

signals.py:

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from .models import Profile

@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
Enter fullscreen mode Exit fullscreen mode

7. Guarding Views

Restrict access to certain views by using @login_required:

views.py:

from django.contrib.auth.decorators import login_required

@login_required
def profile(request):
    return render(request, 'accounts/profile.html')
Enter fullscreen mode Exit fullscreen mode

Update urls.py to include the profile view:

urlpatterns = [
    path('profile/', views.profile, name='profile'),
]
Enter fullscreen mode Exit fullscreen mode

Wrapping Up

In this guide, we’ve covered the essentials of setting up authentication in Django using Function-Based Views (FBVs):

  • Registering users with custom fields.
  • Managing login, logout, and redirects.
  • Associating users with database records.

With this foundation, you’re ready to build more advanced features like social authentication, password resets, or two-factor authentication.

For a complete walkthrough with live demonstrations, check out my video tutorial here: Watch Now

Happy coding! 🚀

Top comments (0)