Profil d'utilisateur Django

Lors de l'ajout de champs supplémentaires à un profil d'utilisateur, tels que l'emplacement, le sexe, l'employeur, etc., devrais-je ajouter des colonnes supplémentaires à django.contrib.auth.models.User et l'enregistrer là? Ou devrais-je créer une nouvelle table pour enregistrer les informations de profil utilisateur?

En outre, lorsqu'un utilisateur télécharge une photo de profil, devrais-je l'enregistrer dans la même table? (Notez que ce n'est pas un serveur de production, je le fais juste sur mon serveur d'exécution local pour comprendre les choses). Merci

36
demandé sur David542 2011-05-22 03:16:05

7 réponses

Vous devez créer un modèle pour le profil utilisateur:

class UserProfile(models.Model):  
    user = models.ForeignKey(User, unique=True)
    location = models.CharField(max_length=140)  
    gender = models.CharField(max_length=140)  
    employer = models.ForeignKey(Employer)
    profile_picture = models.ImageField(upload_to='thumbpath', blank=True)

    def __unicode__(self):
        return u'Profile of user: %s' % self.user.username

, Puis configurer dans settings.py:

AUTH_PROFILE_MODULE = 'accounts.UserProfile'
44
répondu Ezequiel Marquez 2016-04-07 21:24:37

Conceptuellement, OneToOneField est similaire à un ForeignKey avec unique=True, mais le côté "inverse" de la relation retournera directement un seul objet. C'est la façon recommandée d'étendre la classe Utilisateur.

class UserProfile(models.Model):  
    user = models.OneToOneField(User)
    ...
29
répondu Dmitry 2013-09-23 16:14:23

Django fournit un moyen de stocker des informations supplémentaires sur les utilisateurs dans une table séparée (appelée profil utilisateur).

14
répondu vicvicvic 2013-09-22 19:25:13

Django actuel est 1.9 Et voici quelques mises à jour de la réponse acceptée obsolète

  1. utiliser models.OneToOneField(User)
  2. ajouter related_name='profile'
  3. utiliser .__str__() et .format() pour Python 3

Comme ça

class UserProfile(models.Model):  
    user = models.OneToOneField(User, related_name='profile')
    location = models.CharField(max_length=140)  
    gender = models.CharField(max_length=140)  
    ...

    def __str__(self):
        return 'Profile of user: {}'.format(self.user.username)

En utilisant related_name, Vous pouvez accéder facilement au profil d'un utilisateur, par exemple pour request.user

request.user.profile.location
request.user.profile.gender

Pas besoin de recherches supplémentaires.

13
répondu C14L 2016-05-20 14:04:42

À partir de Django 1.5, vous pouvez remplacer L'utilisateur par défaut par votre objet utilisateur personnalisé en utilisant une entrée de paramètres simple:

AUTH_USER_MODEL = 'myapp.MyUser'

Pour plus de détails, consultez cette entrée de documentation Django .

9
répondu Nicu Surdu 2015-12-29 11:32:37

Il y a une solution que j'ai trouvée ici . Fondamentalement, vous étendez simplement le formulaire par défaut UserCreationForm mais en gardant le même nom. Cela fonctionne de manière transparente avec la façon dont les docs de Django vous disent de faire UserProfiles.

4
répondu hitokiri82 2013-07-03 20:23:00

La réponse peut être mise à jour pour ajouter un récepteur de signal qui créera le profil s'il n'existe pas et se mettra à jour s'il est déjà là.

@receiver(post_save, sender=User) def create_or_update_user_profile(sender, instance, created, **kwargs): if created: Profile.objects.create(user=instance) instance.profile.save()

Ce https://simpleisbetterthancomplex.com/tutorial/2016/11/23/how-to-add-user-profile-to-django-admin.html post comprend également comment modifier, la liste du profil personnalisé dans le panneau d'administration.

0
répondu Sachin G. 2017-08-29 06:55:55