7 votes

Django - Suppression du nom d'utilisateur du modèle d'utilisateur

Pour créer un nouveau modèle d'utilisateur dans Django 1.5.x, il existe deux approches :

  1. Hériter de AbstractUser qui est le modèle d'utilisateur par défaut que vous obtenez, de cette façon vous pouvez l'étendre avec tous les attributs que vous voulez. Cependant, si vous voulez supprimer n'importe quel domaine, c'est techniquement possible mais non recommandé même si c'est possible, c'est contraire aux principes de la POO, je crois. Donc, si vous souhaitez modifier le modèle d'utilisateur actuel, il y a la deuxième approche.
  2. Hériter de AbstractBaseUser qui, par en regardant le code fournit une fonctionnalité très basique. Vous ne bénéficierez pas de tous les avantages des permissions, de la recherche de profils et de la construction d'urls absolues, à moins que vous n'en ayez besoin. vous le copiez à partir du modèle d'utilisateur par défaut de Django.

Ce qui précède est ma compréhension de la situation. Corrigez-moi si j'ai tort, mais cela ne signifie-t-il pas que si je veux simplement supprimer l'élément username du modèle puisque je n'en aurai pas besoin du tout, je dois copier-coller le code du modèle fourni dans le framework et hériter de AbstractBaseUser y PermissionsMixin ? Pour une chose aussi simple, cette approche ne me semble pas très jolie, et elle est un peu étrange car je suis certain que le modèle d'utilisateur personnalisé a été introduit en grande partie à cause du cas d'utilisation populaire de email comme identifiant de l'utilisateur au lieu de username .

Vos réflexions (et corrections) s'il vous plaît.

5voto

HankMoody Points 2206

Si vous regardez le code source de la django.contrib.auth.models vous verrez alors que la définition de l'élément AbstractUser Le cours est assez court et commence comme ceci :

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    ...

Il hérite du AbstractBaseUser y PermissionMixin . Vous pouvez définir votre modèle personnalisé et l'hériter des classes mentionnées pour obtenir le support des permissions. Si vous voulez tous les autres champs du modèle, alors oui, vous devrez les copier, mais c'est aussi une occasion de personnaliser les choses pour répondre à vos besoins.

-14voto

nithin h r Points 11

Plutôt que d'utiliser des mixins et d'autres applications qui résolvent le problème, La meilleure façon d'aborder le problème de l'absence de nom d'utilisateur est de remplacer le nom d'utilisateur par l'adresse électronique saisie par l'utilisateur.

Ce que tu dois faire, c'est, aller dans le code source de django qui est généralement situé dans le chemin de python. habituellement dans le site-packeges du dossier python,

Allez dans le dossier django, puis dans le dossier contrib, puis dans le dossier auth, ouvrez le fichier models.py qui contient la définition du modèle User.

On Virtualenv -> <virtualenv_name>/lib/python2.7/site-packages/django

Dans le fichier models.py de l'application auth

Allez à -> Classe AbstractUser remplacez le regex dans "validators.RegexValidator" par ceci :

r"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$"

remplacer seulement la partie regex dans "validators.RegexValidator".

et dans la même classe, modifier la longueur maximale du champ "nom d'utilisateur" en 254

Je n'ai pas eu la réputation de poster une image du code, si quelqu'un veut une capture d'écran de ce à quoi cela ressemble après avoir modifié le code, envoyez-moi un message.

C'est ça !

Maintenant, retournez dans votre application et vous pouvez remplacer le champ du nom d'utilisateur par l'email de n'importe quel type dans ce monde.

La dernière étape : Allez dans votre application où vous utilisez le modèle User, c'est à dire n'importe où

python manage.py syncdb

python manage.py makemigrations

python manage.py migrate

si vous ne voyez pas le modèle d'authentification migrer, faites-le,

python manage.py migrate auth

Maintenant, tout ce que vous devez faire est de remplacer le nom d'utilisateur par l'email, pendant l'enregistrement vous pouvez faire quelque chose comme :

user = User.objects.create_user('email here', 'again email here', 'password here')

Le plus intéressant est que vous n'avez pas à modifier votre backend d'authentification, puisque l'email est lui-même le nom d'utilisateur et que vous pouvez simplement étiqueter le champ du nom d'utilisateur comme email. .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X