[Django] Modifier le help_text password1 et password2
Bonjour,
Je n'arrive pas à modifier les help_text pour les champs password1 et password2.
D'habitute je fais cela dans le formulaire comme ceci :
class UserRegistrationForm(UserCreationForm):
class Meta:
model = CustomUser
fields = ['username', 'email', 'password1', 'password2']
error_messages = {
'username': {
'unique': "Ce nom d'utilisateur est déjà utilisé. Veuillez en choisir un autre.",
'invalid': "Nom d'utilisateur invalide",
},
'email': {
'unique': "Cet email est déjà utilisé. Veuillez en choisir un autre.",
}
}
help_texts = {
'username': "<ul><li>30 caractères maximum.</li><li>3 caractères minimum</li><li>Uniquement des lettres et des chiffres.</li></ul>",
'password1': "test",
'password2': "test",
}
Ça fonctionne pour tous les champs, sauf pour les champs password.
J'ai regardé dans l'interpréteur, on arrive bien à accéder au help_text, de la même manière pour chaque champs :
>>> from accounts.forms import UserRegistrationForm
>>> form = UserRegistrationForm()
>>> form.fields['username'].help_text
'<ul><li>30 caractères maximum.</li><li>3 caractères minimum</li><li>Uniquement des lettres et des chiffres.</li></ul>'
>>> form.fields['password1'].help_text
'<ul><li>Your password can’t be too similar to your other personal information.</li><li>Your password must contain at least 8 characters.</li><li>Your password can’t be a commonly used password.</li><li>Your password can’t be entirely numeric.</li></ul>'
Comment faire pour surcharger ces help_text ?
Le modèle utilisateur CustomUser hérite de AbstractBaseUser.
Et le manager BaseUserManager.
Merci !
Salut Cam !
D'après ce que j'ai trouvé ici, il faut que tu redéfinisses tes propres champ pour le password pour pouvoir modifier les help_text (https://code.djangoproject.com/ticket/31656)
Tu peux procéder comme ça :
from django import forms
from django.contrib.auth.forms import UserCreationForm
class UserRegistrationForm(UserCreationForm):
password1 = forms.CharField(
label="Mot de passe",
widget=forms.PasswordInput,
help_text="Ton nouveau help_text pour password1",
)
password2 = forms.CharField(
label="Confirmation du mot de passe",
widget=forms.PasswordInput,
help_text="Ton nouveau help_text pour password2",
)
Merci Thibault, ça fonctionne !
Par contre je n'arrive pas à saisir comment définir qu'un champ est généré automatiquement ou définis déclarativement ?
Je met l'extrait de la doc :
"ModelForm est comme un formulaire Form normal qui peut générer automatiquement certains champs. Les champs automatiquement générés dépendent du contenu de la classe Meta et des champs éventuellement définis de manière déclarative. Au fond, ModelForm va uniquement générer les champs qui sont absents du formulaire, ou en d’autres termes, les champs qui n’ont pas été définis déclarativement.
Les champs définis déclarativement sont laissés tels quels, ce qui fait que toute personnalisation effectuée au niveau des attributs de Meta, tels que widgets, labels, help_texts ou error_messages est ignorée ; ces derniers ne s’appliquent qu’aux champs automatiquement générés."
Alors oui bonne question j'avoue que la doc n'est pas forcément très claire ("de manière déclarative", c'est assez flou comme terme).
En fait, quand on parle de champs générés automatiquement par un ModelForm, ça veut dire que Django va regarder ton modèle et créer des champs de formulaires pour toi, basés sur les champs que tu as définis dans ton modèle.
Quand un champ est défini "déclarativement" dans ton formulaire, ça veut dire que tu l'écris toi-même dans ta classe formulaire, comme tu viens de le faire pour password1 et password2. Quand tu définis un champ comme ça, Django ne va pas essayer de créer ou de modifier ce champ en se basant sur la classe Meta mais juste utiliser ce que tu as écrit toi-même.
Donc en gros, quand tu définis un champ manuellement (donc "déclaratif"), tu prends le contrôle total sur ce champ dans ton formulaire.
Pour un champ "automatiquement généré", par exemple si tu ne définis pas password1 ou password2 dans ton formulaire UserRegistrationForm, Django va utiliser les infos de ta classe Meta pour définir le champ en se basant sur ton modèle. Si par exemple tu as des help_texts dans Meta, ils s'appliqueront à ces champs automatiquement générés.
À savoir que tu peux mélanger les deux : tu peux avoir un ModelForm sur lequel tu le laisse tout gérer en fonction des champs que tu as mis dans ta classe Meta, et rajouter des champs personnalisés en les déclarant toi-même.
Ça permet d'avoir un formulaire qui est basé sur ton modèle et qui fait 90% du travail pour toi et de rajouter des champs (ou de les écraser / remplacer si le champ existe déjà, comme tu le fais avec password1 et 2).
Ok, c'est beaucoup plus clair maintenant, merci pour l'explication !!
Inscris-toi
(c'est gratuit !)
Tu dois créer un compte pour participer aux discussions.
Créer un compte