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
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