Interview question
What is the difference between widgets and fields in Django forms? Django forms में widgets और fields में क्या अंतर है?
Answer
| Concept | Responsibility |
|---|---|
| Field | Validation logic and Python data type conversion |
| Widget | HTML rendering - what input element is displayed |
from django import forms
class BookForm(forms.Form):
# A Field can be paired with different Widgets for the SAME data type
title = forms.CharField(max_length=200) # default: <input type='text'>
description = forms.CharField(widget=forms.Textarea) # <textarea> instead
password = forms.CharField(widget=forms.PasswordInput) # <input type='password'>
# Same underlying type (choice), different widgets
category = forms.ChoiceField(
choices=[('fic', 'Fiction'), ('nf', 'Non-Fiction')],
widget=forms.Select # dropdown
)
genres = forms.MultipleChoiceField(
choices=[('sci-fi', 'Sci-Fi'), ('fantasy', 'Fantasy')],
widget=forms.CheckboxSelectMultiple # checkboxes
)
# Customizing widget HTML attributes
price = forms.DecimalField(
widget=forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01'})
)
published_date = forms.DateField(
widget=forms.DateInput(attrs={'type': 'date'}) # HTML5 date picker
)
# Common built-in widgets:
# TextInput, Textarea, PasswordInput, EmailInput, NumberInput,
# Select, SelectMultiple, CheckboxInput, CheckboxSelectMultiple,
# RadioSelect, DateInput, FileInput, HiddenInput
# For ModelForm, customizing widgets via Meta
class BookModelForm(forms.ModelForm):
class Meta:
model = Book
fields = ['title', 'description', 'price']
widgets = {
'description': forms.Textarea(attrs={'rows': 3}),
'price': forms.NumberInput(attrs={'step': '0.01'}),
}
# Custom widget - subclassing an existing widget for reusable behavior
class StarRatingWidget(forms.RadioSelect):
template_name = 'widgets/star_rating.html'| Concept | Responsibility |
|---|---|
| Field | Validation logic और Python type conversion |
| Widget | HTML rendering |
from django import forms
class BookForm(forms.Form):
title = forms.CharField(max_length=200)
description = forms.CharField(widget=forms.Textarea)
password = forms.CharField(widget=forms.PasswordInput)
category = forms.ChoiceField(
choices=[('fic', 'Fiction'), ('nf', 'Non-Fiction')],
widget=forms.Select
)
genres = forms.MultipleChoiceField(
choices=[('sci-fi', 'Sci-Fi'), ('fantasy', 'Fantasy')],
widget=forms.CheckboxSelectMultiple
)
price = forms.DecimalField(
widget=forms.NumberInput(attrs={'class': 'form-control', 'step': '0.01'})
)
published_date = forms.DateField(
widget=forms.DateInput(attrs={'type': 'date'})
)
class BookModelForm(forms.ModelForm):
class Meta:
model = Book
fields = ['title', 'description', 'price']
widgets = {
'description': forms.Textarea(attrs={'rows': 3}),
'price': forms.NumberInput(attrs={'step': '0.01'}),
}
class StarRatingWidget(forms.RadioSelect):
template_name = 'widgets/star_rating.html'Was this answer clear?