Django : un modèle sur mesure : DaysField étape 2/3
Formulaire spécifique pour un modèle sur-mesure
Après les conversions (base / et / ou / Python) vers données Python (dans les deux sens), il nous faut écrire notre formulaire spécifique pour notre modèle DaysField
sur-mesure.
Ici, l’utilisateur doit pouvoir cocher / ou pas / des valeurs qui correspondent aux jours de la semaine.
Au jour de l’écriture de ce document, la documentation n’est pas complète.
Officiellement, il « suffirait » de surcharger def formfield(self, **kwargs)
en y ajoutant sa propre classe de formulaire via l’index « form_class
» de kwargs
.
L’exemple proposé ne fonctionne pas !
En effet, lorsqu’on affiche le modèle dans l’interface d’administration, kwargs
est déjà pré-rempli avec l’indice « widget
» qui est le composant spécifique pour l’administration. Pour que leur exemple fonctionne, il faudrait supprimer « widget
» avant d’y ajouter « form_class
».
J’ai opté pour la méthode directe qui ignore « kwargs » :
def formfield(self, **kwargs):
# ignore the admin directives: directly override with our custom form:
return super().formfield(form_class=DaysFormField,
initial=[])
Enfin, la classe DaysFormField
elle-même :
class DaysFormField(forms.TypedMultipleChoiceField):
def __init__(self, *args, **kwargs):
if 'max_length' in kwargs:
kwargs.pop('max_length')
kwargs['choices'] = DaysOfWeek.CHOICES
super().__init__(*args, **kwargs)
Cela affiche maintenant un choix ainsi :
On peut facilement le modifier en y précisant un autre widget, par exemple :
class DaysFormField(forms.TypedMultipleChoiceField):
widget = forms.CheckboxSelectMultiple
# (le reste du code avec __init_())
Cela affiche maintenant un choix ainsi :