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.