Subjects

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

What is the difference between widgets and fields in Django forms? Django forms में widgets और fields में क्या अंतर है?

Answer
ConceptResponsibility
FieldValidation logic and Python data type conversion
WidgetHTML 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'
ConceptResponsibility
FieldValidation logic और Python type conversion
WidgetHTML 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?