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 :
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>'
)
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)
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.
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).
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__.
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.
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 :
documenter un champ
Field.additionnal_field_infos
à utiliser comme suit :utiliser
form.field[""].widget.attr
:déclarer un membre
additionnal_field_infos
pour la classeDsfrBaseForm
qui s'utiliserait comme suit :Aucune solution n'est vraiment satisfaisante.
oblige à toujours écrire un
__init__
et peut être incompréhensible si la personne écritself["field"]
(qui contient leField
) au lieu deself.fields["field"]
(qui contient leBoundField
correspondant).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
duField
ou écrire un__init__
.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 seuleModelForm
a une classeMeta
.