Django définir des widgets dans un ModelForm

Les ModelForm sont des formulaires autogénérés à partir des models. On peut grâce à ce système générer, valider et enregistrer le formulaire facilement.
Cependant, parfois nous avons besoin de personnaliser le widget pour redimensionner un textarea, utiliser un datepicker sur un champ date, ou encore plein d'autres raisons valables.

Définir un widget dans un ModelForm

Il m'est déjà arrivé d'ajouter un champ dans un ModelForm pour définir le widget. C'est-à-dire que je créais un champ dans le ModelForm (du même nom que la propriété du model), je définissais ensuite son type et son widget pour surcharger le champ existant.
Ce n'était pas très propre, ni très pythonique, mais ça fonctionnait.
Depuis j'ai découvert une autre technique très pratique. Un exemple sera plus simple à comprendre :

class MesureTailleForm(ModelForm):
"""
Ce formulaire est utilisé pour enregistrer la taille d'une personne et un commentaire à un instant t.
"""
class Meta:
model = Taille
fields = (
'taille', 'date_mesure', 'commentaire'
)
widgets = {
'commentaire' : forms.Textarea(attrs={'rows': 5, 'cols': 50,})
}


Dans cet exemple, nous voyons que la définition des widgets se fait dans la classe Meta. Cette méthode permet de bénéficier de la puissance des modelForm tout en gardant une certaine flexibilité. C'est justement l'un des énormes avantages de Django que d'être extrêmement flexible.