Django : mémo des formulaires « sur mesure »
Voici un mémo des « étapes » à remplir dans l’ordre pour faire un formulaire sur mesure en Django « dans l’ordre »:
- Créer un formulaire. Classique. Faire un
ModelFormet utiliser la classeMetapour déclarer le modèle viamodel, et déclarer les champs viafields. - Construire ces champs du modèle dans le formulaire. Attention, ne pas confondre le types du champ (qui est en base = le champ du modèle), c’est ce que vous créez, et le
widgetdans lequel ce champ sera rendu (cf mon exemple dans l’article précédent). - Construire la vue, dans le cas update du principe CRUD, j’hérite de
generic.UpdateView - Dans le formulaire d’origine, créer la fonction dit si le formulaire est valide ou pas :
def is_valid(self) - Dans la vue, après que le formulaire ait été validé, écrire la fonction
def form_valid(self, form)qui est appelée lorsque le formulaire est valide, et utiliser les données nettoyées du formulaireform.cleaned_datapour enregistrer ce que l’on veut - Pré-remplir les champs du formulaire, y compris les champs « sur mesure » : c’est dans la vue, via
def get_initial(self)
Ouf ! Une fois que tout ça est implémenté, Django construit la vue en lecture (GET) selon un chemin qui ressemble en gros à ça :
vue -> form_classforme -> class Meta -> model + fieldsforme -> constructeur __init__(ajout champs sur mesure)vue -> get_initial(remplir les valeurs de tous les champs du formulaire)
Django construit la vue en écriture (POST) selon un chemin qui ressemble en gros à ça :
vue -> form_classforme -> class Meta -> model + fieldsforme -> constructeur __init__(ajout champs sur mesure)forme -> def is_valid(self)forme -> def clean_xx(self) (code qui valide/ou pas le champ xx)forme -> def clean(self) (code qui valide/ou pas tous les champs)vue -> def form_valid(self, form)(sauver ici avecform.cleaned_data)
Alors oui je sais c’est compliqué. Mais quand on y réfléchit bien, sur le modèle MVC, on ne peut pas faire autrement, et c’est le mieux possible. Et encore je n’ai pas parlé de la routine « save() » qui est dans le formulaire : elle est automatiquement appelée lors is_valid() renvoie true, et dans le cas d’un ModelForm elle sauvegarde le formulaire.