https://contentgardeningstudio.com/python/gerer-des-comptes-utilisateurs-et-profils-personnalises-pour-votre-site-django/

https://openclassrooms.com/fr/courses/7192426-allez-plus-loin-avec-le-framework-django/7386368-personnalisez-le-modele-utilisateur

Notre ambition est de publier notre site. Mais pour qui et pour y faire quoi ? Nous voulons en rendre certaines parties publiques et d’autres restreintes à des personnes choisies. Nous pouvons aussi donner des droits pour certaines parties du site, à des personnes autorisées, tels que créer ou modifier tel ou tel article, telle ou telle donnée.

Après avoir créé un projet lors de l’installation de Django, nous allons construire une application d’authentification à partir de ces premiers principes : les utilisateurs pourront se connecter et se déconnecter de notre application web.

Django fournit un modèle d’utilisateurs, mais il peut ne pas répondre à tous nos besoins. Par exemple, nous pourrions vouloir ajouter des champs supplémentaires comme une photo de profil ou des liens vers des réseaux sociaux. Dans ces cas, il est recommandé de créer un modèle d’utilisateur personnalisé.

Le modèle User¶

class models.User

  • username¶ Obligatoire. Au maximum 150 caractères. Les noms d’utilisateur peuvent contenir des caractères alphanumériques (_, @, +, . et -).
  • first_name¶ Facultatif (blank=True). 150 caractères ou moins.
  • last_name¶ Facultatif (blank=True). 150 caractères ou moins.
  • email¶ Facultatif (blank=True). Adresse électronique.
  • password¶ Obligatoire. Une empreinte avec métadonnées du mot de passe (Django ne stocke pas le mot de passe en clair). La longueur des mots de passe réels n’est pas limitée, ni les caractères qu’ils contiennent. Les métadonnées de ce champ peuvent aussi marquer le mot de passe comme inutilisable. Voir la documentation sur les mots de passe.
  • groups¶ Une relation plusieurs-à-plusieurs vers Group.
  • user_permissions¶ Une relation plusieurs-à-plusieurs vers Permission.
  • is_staff¶ Valeur booléenne. Permet à cet utilisateur d’accéder au site d’administration.
  • is_active¶ Valeur booléenne. Marque ce compte utilisateur comme actif. Nous recommandons de définir ce drapeau à False au lieu de supprimer le compte. Ainsi, si vos applications comportent des clés étrangères vers des utilisateurs, les clés étrangères ne seront pas cassées.
Ceci ne détermine pas forcément si l’utilisateur peut se connecter ou non. Les moteurs d’authentification ne sont pas obligés de vérifier le drapeau is_active, mais le moteur par défaut (ModelBackend) et le moteur RemoteUserBackend le font. Vous pouvez utiliser AllowAllUsersModelBackend ou AllowAllUsersRemoteUserBackend si vous voulez autoriser les utilisateurs inactifs à se connecter. Dans ce cas, vous devrez aussi adapter le formulaire AuthenticationForm utilisé par la vue LoginView car il rejette les utilisateurs inactifs. Soyez conscient que les méthodes de contrôle des permissions telles que has_perm() ainsi que l’authentification dans le site d’administration de Django renvoient toutes False pour les utilisateurs inactifs.
  • is_superuser¶ Valeur booléenne. Considère cet utilisateur comme ayant toutes les permissions sans devoir lui en attribuer aucune en particulier.
  • last_login¶ Horodatage de la dernière connexion de l’utilisateur.
  • date_joined¶ L’horodatage de la création du compte.

Quatre possibilités s’offrent à nous :
1 - Ne rien faire. Django nous offre déjà une solution acceptable
2 - Compléter la solution offerte par Django en ajoutant des champs au modèle fourni par Django
3 - Compléter la solution offerte par Django créant un enregistrement en relation 1 à 1
4 - Partir d’une page blanche et tout définir nous-même.

Nous choisirons les solutions 2 et 3, c-à-d compléter la solution existante et créer un enregistrement qui complétera les données de base

Création de l’application authentification

Les données Django
https://docs.djangoproject.com/fr/6.1/ref/contrib/auth/#fields
Pour créer un modèle d’utilisateur personnalisé, vous devez créer une classe qui hérite de la classe abstraite

il faut installer Pillow
python -m pip install Pillow

>> python manage.py migrate