Quelle est la meilleure façon d'étendre le modèle utilisateur (fourni avec l'application d'authentification de Django) avec des champs personnalisés? Je voudrais également éventuellement utiliser l'e-mail comme nom d'utilisateur (à des fins d'authentification).
J'ai déjà vu quelques façons de le faire, mais je ne peux pas décider laquelle est la meilleure.
Réponses:
La façon la moins pénible et même recommandée par Django de le faire est d'utiliser une
OneToOneField(User)
propriété.Cela dit, l'étendre
django.contrib.auth.models.User
et le supplanter fonctionne aussi ...Je resterais certainement à l'écart de changer la classe utilisateur réelle dans votre arborescence source Django et / ou de copier et de modifier le module d'authentification.
la source
user = models.ForeignKey(User, unique=True)
est-ce la même chose queuser = models.OneToOneField(User)
? Je pense que l'effet final est le même? Mais peut-être que l'implémentation dans le backend est différente.Remarque: cette réponse est déconseillée. voir d'autres réponses si vous utilisez Django 1.7 ou une version ultérieure.
Voilà comment je le fais.
Cela créera un profil utilisateur chaque fois qu'un utilisateur est enregistré s'il est créé. Vous pouvez ensuite utiliser
Voici quelques informations supplémentaires de la documentation
http://docs.djangoproject.com/en/dev/topics/auth/#storing-additional-information-about-users
Mise à jour: veuillez noter qu'elle
AUTH_PROFILE_MODULE
est obsolète depuis la version 1.5: https://docs.djangoproject.com/en/1.5/ref/settings/#auth-profile-modulela source
user = models.ForeignKey( User )
et récupérer l'objet de profil viauser.get_profile()
. N'oubliez pasfrom django.contrib.admin.models import User
.User
Eh bien, un certain temps s'est écoulé depuis 2008 et il est temps pour une nouvelle réponse. Depuis Django 1.5, vous pourrez créer une classe d'utilisateurs personnalisée. En fait, au moment où j'écris ceci, il a déjà été fusionné dans master, vous pouvez donc l'essayer.
Il y a des informations à ce sujet dans les documents ou si vous souhaitez approfondir, dans ce commit .
Tout ce que vous avez à faire est d'ajouter
AUTH_USER_MODEL
aux paramètres avec le chemin vers la classe d'utilisateurs personnalisée, qui s'étend soitAbstractBaseUser
(version plus personnalisable) ouAbstractUser
(plus ou moins ancienne classe d'utilisateurs que vous pouvez étendre).Pour les personnes qui sont paresseuses à cliquer, voici un exemple de code (tiré de documents ):
la source
email
c'est le nom d'utilisateur.unique=True
au champ email pour laisser l'USERNAME_FIELD
accepterDepuis Django 1.5, vous pouvez facilement étendre le modèle utilisateur et conserver une seule table dans la base de données.
Vous devez également le configurer en tant que classe d'utilisateurs actuelle dans votre fichier de paramètres
Si vous souhaitez ajouter un grand nombre de préférences des utilisateurs, l'option OneToOneField peut être un meilleur choix.
Une note pour les personnes développant des bibliothèques tierces: si vous avez besoin d'accéder à la classe d'utilisateurs, n'oubliez pas que les gens peuvent la changer. Utilisez l'aide officielle pour obtenir la bonne classe
la source
django_social_auth
, je vous recommande d'utiliser une relation OneToOne. N'UTILISEZ PAS cette méthode sinon elle gâcherait vos migrations.django_social_auth
plugin et de définir AUTH_USER_MODEL à l'utilisateur d'authentification sociale. Ensuite, lorsque j'ai exécuté la migration de manage.py, cela a gâché mon application. Lorsque, à la place, j'ai utilisé le modèle d'utilisateur d'authentification sociale en tant que relation OneToOne, décrit ici: stackoverflow.com/q/10638293/977116Changing this setting after you have tables created is not supported by makemigrations and will result in you having to manually write a set of migrations to fix your schema
source: docs.djangoproject.com/en/dev/topics/auth/customizing/…Il existe une recommandation officielle sur le stockage d'informations supplémentaires sur les utilisateurs . Le livre Django traite également de ce problème dans la section Profils .
la source
Celui ci-dessous est une autre approche pour étendre un utilisateur. Je pense que c'est plus clair, facile, lisible puis au-dessus de deux approches.
http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/
En utilisant l'approche ci-dessus:
la source
Vous pouvez simplement étendre le profil de l'utilisateur en créant une nouvelle entrée à chaque fois qu'un utilisateur est créé à l'aide des signaux de sauvegarde de Django
models.py
Cela créera automatiquement une instance d'employé lorsqu'un nouvel utilisateur est créé.
Si vous souhaitez étendre le modèle utilisateur et souhaitez ajouter des informations supplémentaires lors de la création d'un utilisateur, vous pouvez utiliser django-betterforms ( http://django-betterforms.readthedocs.io/en/latest/multiform.html ). Cela créera un formulaire d'ajout d'utilisateur avec tous les champs définis dans le modèle UserProfile.
models.py
forms.py
views.py
addUser.html
urls.py
la source
Extension du modèle utilisateur Django (UserProfile) comme un pro
J'ai trouvé cela très utile: lien
Un extrait:
depuis django.contrib.auth.models import User
la source
Nouveau dans Django 1.5, vous pouvez maintenant créer votre propre modèle d'utilisateur personnalisé (ce qui semble être une bonne chose à faire dans le cas ci-dessus). Voir 'Personnalisation de l'authentification dans Django'
Probablement la nouvelle fonctionnalité la plus cool de la version 1.5.
la source
C'est ce que je fais et c'est à mon avis le moyen le plus simple de le faire. définir un gestionnaire d'objets pour votre nouveau modèle personnalisé puis définir votre modèle.
N'oubliez pas d'ajouter cette ligne de code dans votre
settings.py
:C'est ce que je fais et ça marche toujours.
la source
Actuellement à partir de Django 2.2, la méthode recommandée lors du démarrage d'un nouveau projet consiste à créer un modèle utilisateur personnalisé qui hérite de AbstractUser, puis à pointer AUTH_USER_MODEL vers le modèle.
Source: https://docs.djangoproject.com/en/2.2/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project
la source
Une approche simple et efficace est models.py
la source