Django Form Password Validation Example

Published on March 25, 2025 Django

Django Form Password Validation Example

Hi Dev,

In this tutorial, you'll learn how to implement Django form password validation with a working example. This Django password validation example ensures strong password policies while collecting user credentials in forms. This tutorial covers creating a project, defining validators, rendering the form, and handling validation logic.

Django’s built-in password validation helps improve security and user safety. The validators ensure that passwords are not too common, not fully numeric, and are not too similar to user details.

  • Similarity: Ensures passwords are not similar to username, first name, last name, or email.
  • Minimum length: Default minimum is 8, but customizable (e.g. 6).
  • Common Password: Blocks use of common passwords (Django includes 20,000+).
  • Numeric: Passwords cannot be purely numeric.

Let’s get started with this step-by-step Django password validation tutorial.

Step 1: Create a Project

In this step, we’ll create a new django project using the django-admin. Head back to your command-line interface and run the following command:

django-admin startproject exampleapp

Step 2: Create an App

Now we'll create a single app called core to handle our forms. Use the command below:

python3 manage.py startapp core

Step 3: Update setting.py

Add the core app to the INSTALLED_APPS list and configure password validators as shown:

INSTALLED_APPS = [
    ...
    'core',
]

AUTH_PASSWORD_VALIDATORS = [
    {'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'},
    {'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 'OPTIONS': {'min_length': 6}},
    {'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator'},
    {'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator'},
]

Step 4: Create a Form

Create a forms.py file and define the custom form with password confirmation:

from django import forms
from django.contrib.auth import password_validation

class EmpRegistration(forms.Form):
    username = forms.CharField(label='Username',
                                widget=forms.TextInput(attrs={'class': 'form-control'}))
    password = forms.CharField(label='Password',
                                widget=forms.PasswordInput(attrs={'class': 'form-control'}),
                                help_text=password_validation.password_validators_help_text_html)
    confirm_Password = forms.CharField(label='Confirm Password',
                                       widget=forms.PasswordInput(attrs={'class': 'form-control'}))

    def clean(self):
        cleaned_data = super().clean()
        password1 = self.cleaned_data.get('password')
        cpassword = self.cleaned_data.get('confirm_Password')

        if password1 != cpassword:
            raise forms.ValidationError('Confirm Password is not same as Password')
        password_validation.validate_password(password1)
        return self.cleaned_data

Step 5: Creating the Views

Define the view to handle form rendering and POST data:

from django.shortcuts import render
from .forms import EmpRegistration

def detail_form(request):
    if request.method == "POST":
        form = EmpRegistration(request.POST)
        if form.is_valid():
            print('Username:', form.cleaned_data['username'])
            print('Password:', form.cleaned_data['password'])
            print('Confirm Password:', form.cleaned_data['confirm_Password'])
    else:
        form = EmpRegistration()
    return render(request, 'home.html', {'form': form})

Step 6: Creating the Templates

Create the template core/templates/home.html with the following content:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Tuts-Station.com</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
    <style type="text/css">
        body{
            background-color: #f7fcff;
        }
    </style>
</head>
<body>
    <div class="container mt-5 pt-5">
        <div class="row d-flex justify-content-center">
            <div class="col-md-8">
                <div class="card">
                    <div class="card-header">
                        <h4>Django Form Password Validation Example - <span class="text-primary">Tuts-Station.com</span></h4>
                    </div>
                    <div class="card-body">
                        <form method="post" enctype="multipart/form-data">
                            {% csrf_token %}
                            {{ form.as_p }}
                            <button type="submit" class="btn btn-success">Submit</button>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>

Step 7: Creating Urls

Update core/urls.py and project’s main urls.py:

# core/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('password', views.detail_form, name='detail_form'),
]
# exampleapp/urls.py
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('core.urls')),
]

Run the Server

Start your Django development server:

python manage.py runserver

Then visit:

http://localhost:8000/password

I hope this example helps you implement secure and user-friendly password validation in Django forms!

Frequently Asked Questions (FAQs)

1. How does Django validate passwords?

Django uses a set of built-in validators like minimum length, common passwords, similarity to personal info, and numeric checks to enforce password policies.

2. How can I change the minimum password length in Django?

You can update the MinimumLengthValidator option in AUTH_PASSWORD_VALIDATORS in settings.py.

3. Can I use custom password validators?

Yes, Django allows writing custom password validators by creating a class that implements validate() and get_help_text() methods.

4. What if I want to display error messages directly on the form?

Use {{ form.errors }} in your template to display validation errors near the form fields.

5. Is it mandatory to use Django’s password validation?

No, but it's strongly recommended for better security and user protection.

Related Posts