Model Forms

  • Learn how Django ModelForms simplify form creation using existing database models.
  • What is a ModelForm?

    A ModelForm is a Django form that is directly connected to a model.

    It automatically:

    • Creates form fields from model fields

    • Saves data to the database

    • Handles validation

    Form vs ModelForm

    Feature

    Form

    ModelForm

    DB Connection

    ❌ No

    ✅ Yes

    Field definition

    Manual

    Automatic

    Save data

    Custom code

    form.save()

Creating a ModelForm

We will use this model:

class Student(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()
    age = models.IntegerField()
    is_active = models.BooleanField(default=True)

Creating a ModelForm [ forms.py ]

This ModelForm automatically generates form fields from the Student model.

from django import forms
from .models import Student

class StudentForm(forms.ModelForm):
    class Meta:
        model = Student
        fields = ['name', 'email', 'age']
  • Explanation

    • forms.ModelForm → base class

    • Meta → configuration class

    • model → linked model

    • fields → fields to include

    Using Model Form in Views

Create Student Using ModelForm [ views.py ]

This view inserts data into the database using ModelForm.

from django.shortcuts import render, redirect
from .forms import StudentForm

def add_student(request):
    form = StudentForm(request.POST or None)
    if form.is_valid():
        form.save()
        return redirect('student_list')

    return render(request, 'add_student.html', {'form': form})
  • Explanation

    • form.save() → inserts record

    • No manual SQL required

    Rendering ModelForm

Render ModelForm in Template

<form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Save</button>
</form>
  • Editing Data Using ModelForm

Update Record Using ModelForm

This updates an existing student record.

def edit_student(request, id):
    student = Student.objects.get(id=id)
    form = StudentForm(request.POST or None, instance=student)

    if form.is_valid():
        form.save()
        return redirect('student_list')

    return render(request, 'edit_student.html', {'form': form})
  • instance connects form to existing object.

    Form Validation (ModelForm)

    Built-in Validation

    • Required fields

    • Data type validation

    • Unique field validation

    Custom Field Validation

Field-Level Validation [ forms.py ]

Validates age field manually.

class StudentForm(forms.ModelForm):
    class Meta:
        model = Student
        fields = ['name', 'email', 'age']

    def clean_age(self):
        age = self.cleaned_data.get('age')
        if age < 18:
            raise forms.ValidationError("Age must be 18 or above")
        return age

Form-Level Validation

Validates multiple fields together.

def clean(self):
        cleaned_data = super().clean()
        email = cleaned_data.get('email')

        if email and not email.endswith('@gmail.com'):
            raise forms.ValidationError("Only Gmail allowed")

Handling Validation Errors in Template

{% if form.errors %}
    <div class="error">
        {{ form.errors }}
    </div>
{% endif %}

Registration Form with Validation

class RegistrationForm(forms.ModelForm):
    class Meta:
        model = Student
        fields = ['name', 'email', 'age']

    def clean_email(self):
        email = self.cleaned_data.get('email')
        if Student.objects.filter(email=email).exists():
            raise forms.ValidationError("Email already exists")
        return email