Modifier les appels à la méthode clean()
Constat
Lorsqu'on enregistre un modèle avec un formulaire, la méthode clean()
du modèle est appelée 2 fois s'il n'y a pas d'erreurs.
Ce comportement est normal car la méthode clean()
est appelée automatiquement lors de la validation du formulaire et nous avons rajouté un appel à cette méthode dans le save()
du modèle, ce qui permettait de faire la validation au niveau du modèle et non au niveau du formulaire.
Django semble donc pensé pour faire les validations au niveau des formulaires (validation des saisies utilisateur) et que les instances crées dans le code n'ont pas à être validées (sauf appel express à une fonction de validation).
Premières propositions
- Continuer ainsi, mais ce n'est pas bien efficace de faire exécuter deux fois le même code.
- Enlever l'appel à
clean()
dans lesave()
des modèles. Sachant qu'il faudra alors appelerclean()
manuellement dans le code si on veut effectuer une validation et qu'il faudra modifier les tests en testant les erreurs de validation surinstance.clean()
au lieu deinstance.save()
. - Modifier le nom de la méthode
clean()
dans les modèles (par exemplevalidation()
). Mais, je ne sais pas si Django gèrera bien lesValidationError
lancées à cet endroit car, le formulaire aura passé toutes les étapes de validation avant d'arriver à l'erreur. - Ajouter aux modèles une variable qui indique si on est déjà passé dans
clean()
avant lesave()