Interview question
What is the difference between Django's Form and ModelForm? Django के Form और ModelForm में क्या अंतर है?
Answer
| Aspect | Form | ModelForm |
|---|---|---|
| Fields | Manually defined, no model tie-in | Auto-generated from a model's fields |
| Saving | No built-in save() - manual handling | save() creates/updates a model instance directly |
| Use case | Non-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})| पहलू | Form | ModelForm |
|---|---|---|
| Fields | Manually define | Model से auto-generated |
| Saving | Built-in save() नहीं | save() model instance बनाता/update करता है |
| Use case | Non-model data | Database 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?