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
ModelForm
et utiliser la classeMeta
pour 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
widget
dans 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_data
pour 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_class
forme -> class Meta -> model + fields
forme -> 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_class
forme -> class Meta -> model + fields
forme -> 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.