Subjects

All subjects Django Java Python React Spring Boot JavaScript PHP
Sign Up Free
Question 1 of 9 · Django Forms & Validation
Interview question

What is the difference between Django's Form and ModelForm? Django के Form और ModelForm में क्या अंतर है?

Answer
AspectFormModelForm
FieldsManually defined, no model tie-inAuto-generated from a model's fields
SavingNo built-in save() - manual handlingsave() creates/updates a model instance directly
Use caseNon-model data (search forms, contact forms)Forms that directly map to a database model
from django import forms
from .models import Book

# Form - manually defined, not tied to any model
class ContactForm(forms.Form):
    name = forms.CharField(max_length=100)
    email = forms.EmailField()
    message = forms.CharField(widget=forms.Textarea)

def contact_view(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            # must manually handle the cleaned data - no save()
            send_email(form.cleaned_data['email'], form.cleaned_data['message'])
    else:
        form = ContactForm()
    return render(request, 'contact.html', {'form': form})

# ModelForm - auto-generated from the Book model
class BookForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ['title', 'author', 'price']  # or fields = '__all__'

def create_book(request):
    if request.method == 'POST':
        form = BookForm(request.POST)
        if form.is_valid():
            book = form.save()  # creates a new Book instance directly
            return redirect('book-detail', pk=book.pk)
    else:
        form = BookForm()
    return render(request, 'book_form.html', {'form': form})

# ModelForm for UPDATING an existing instance
def edit_book(request, pk):
    book = get_object_or_404(Book, pk=pk)
    form = BookForm(request.POST or None, instance=book)
    if request.method == 'POST' and form.is_valid():
        form.save()  # updates the existing book
        return redirect('book-detail', pk=book.pk)
    return render(request, 'book_form.html', {'form': form})
पहलूFormModelForm
FieldsManually defineModel से auto-generated
SavingBuilt-in save() नहींsave() model instance बनाता/update करता है
Use caseNon-model dataDatabase model से map होने वाले forms
from django import forms
from .models import Book

# Form - model से जुड़ा नहीं
class ContactForm(forms.Form):
    name = forms.CharField(max_length=100)
    email = forms.EmailField()
    message = forms.CharField(widget=forms.Textarea)

def contact_view(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            send_email(form.cleaned_data['email'], form.cleaned_data['message'])
    else:
        form = ContactForm()
    return render(request, 'contact.html', {'form': form})

# ModelForm - Book model से auto-generated
class BookForm(forms.ModelForm):
    class Meta:
        model = Book
        fields = ['title', 'author', 'price']

def create_book(request):
    if request.method == 'POST':
        form = BookForm(request.POST)
        if form.is_valid():
            book = form.save()
            return redirect('book-detail', pk=book.pk)
    else:
        form = BookForm()
    return render(request, 'book_form.html', {'form': form})

def edit_book(request, pk):
    book = get_object_or_404(Book, pk=pk)
    form = BookForm(request.POST or None, instance=book)
    if request.method == 'POST' and form.is_valid():
        form.save()
        return redirect('book-detail', pk=book.pk)
    return render(request, 'book_form.html', {'form': form})

Was this answer clear?