numerique-gouv / django-dsfr

Intégration du système de design de l'État français dans Django
https://numerique-gouv.github.io/django-dsfr/
Other
25 stars 9 forks source link

Introduire un paramètre d'informations suppmémentaires dans le template des champs #153

Open christophehenry opened 1 week ago

christophehenry commented 1 week ago

Le design du DSFR permet d'introduire des informations supplémentaires sous un champs, comme pour le champ mot de passe sur ce formulaire. Malheureusement, Field ne fourni aucun paramètre qui permette d'avoir ces infos.

3 solutions possibles :

  1. documenter un champ Field.additionnal_field_infos à utiliser comme suit :

    class ExampleForm(DsfrBaseForm):
       field = TextInput()
    
       def __init__(self, *args, **kwargs):
           super().__init__(*args, **kwargs)
           self["field"].additionnal_field_infos = mark_safe(
               '<p class="fr-message fr-message--info">12 caractères minimum</p>'
           )
  2. utiliser form.field[""].widget.attr :

    class ExampleForm(DsfrBaseForm):
       field = TextInput(widget=Widget(attrs={
           "additionnal_field_infos": mark_safe(
               '<p class="fr-message fr-message--info">12 caractères minimum</p>'
           )
       })) 
    
       def __init__(self, *args, **kwargs):
          # Ou alors
           self["field"].widget.attrs["additionnal_field_infos"] = mark_safe(
               '<p class="fr-message fr-message--info">12 caractères minimum</p>'
           )
           super().__init__(*args, **kwargs)
  3. déclarer un membre additionnal_field_infos pour la classe DsfrBaseForm qui s'utiliserait comme suit :

     class ExampleForm(DsfrBaseForm):
       field = TextInput()
       additionnal_field_infos = {
           "field": mark_safe(
               '<p class="fr-message fr-message--info">12 caractères minimum</p>'
           )
       }

    Aucune solution n'est vraiment satisfaisante.

  4. oblige à toujours écrire un __init__ et peut être incompréhensible si la personne écrit self["field"] (qui contient le Field) au lieu de self.fields["field"] (qui contient le BoundField correspondant).

  5. mélange des informations sur les attributs HTML avec des informations sur le widget, ce qui est contre-intuitif, oblige à surcharger le paramètre widget du Field ou écrire un __init__.

  6. a ma préférence, même si elle n'est pas très Djangonique. L'idéal serait un membre dans la classe Meta mais seule ModelForm a une classe Meta.