diff --git a/chapters/forms.tex b/chapters/forms.tex index 022e83f..c806c93 100644 --- a/chapters/forms.tex +++ b/chapters/forms.tex @@ -48,6 +48,60 @@ Ils agissent come une glue entre l'utilisateur et la modélisation de vos struct Tout comme pour le modèle (+ ref), l'idée est simplement de définir plusieurs niveaux de validation. +\section{Gestion du changement} + +Dans le package \texttt{django.contrib.admin.utils}, on trouve une petite pépite du nom de \texttt{construct\_change\_message}. +Cette fonction permet de construire un message de changement à partir de n'importe que \texttt{form} ou \texttt{formset}. +Elle prend en paramètre une valeur booléenne supplémentaire qui indique s'il s'agit d'un ajout ou pas. +Le résultat retourne une structure qui indique les champs qui ont été modifiés, les champs qui ont été ajoutés ou supprimés: + +\begin{minted}{python} +def construct_change_message(form, formsets, add): + + [snip] + + change_message = [] + if add: + change_message.append({"added": {}}) + elif form.changed_data: + change_message.append({"changed": {"fields": changed_field_labels}}) + if formsets: + with translation_override(None): + for formset in formsets: + for added_object in formset.new_objects: + change_message.append( + { + "added": { + "name": str(added_object._meta.verbose_name), + "object": str(added_object), + } + } + ) + for changed_object, changed_fields in formset.changed_objects: + change_message.append( + { + "changed": { + "name": str(changed_object._meta.verbose_name), + "object": str(changed_object), + "fields": _get_changed_field_labels_from_form( + formset.forms[0], changed_fields + ), + } + } + ) + for deleted_object in formset.deleted_objects: + change_message.append( + { + "deleted": { + "name": str(deleted_object._meta.verbose_name), + "object": str(deleted_object), + } + } + ) + + return change_message +\end{minted} + \section{Dépendance avec le modèle} Un \textbf{form} peut hériter d'une autre classe Django.