Django профиль пользователя - PullRequest
39 голосов
/ 22 мая 2011

При добавлении дополнительных полей в профиль пользователя, таких как местоположение, пол, работодатель и т. Д., Следует ли добавлять дополнительные столбцы в django.contrib.auth.models.User и сохранять их там?Или я должен создать новую таблицу для сохранения информации профиля пользователя?

Кроме того, когда пользователь загружает изображение профиля, мне следует сохранить его в той же таблице?(Обратите внимание, что это не рабочий сервер, я просто делаю это на своем локальном сервере запуска, чтобы разобраться).Спасибо

Ответы [ 7 ]

45 голосов
/ 23 мая 2011

Вы должны сделать модель для профиля пользователя:

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

Затем настройте в settings.py:

AUTH_PROFILE_MODULE = 'accounts.UserProfile'
29 голосов
/ 23 сентября 2013

Концептуально OneToOneField похож на ForeignKey с unique = True, но «обратная» сторона отношения будет напрямую возвращать один объект.Это рекомендуемый способ расширения пользовательского класса.

class UserProfile(models.Model):  
    user = models.OneToOneField(User)
    ...
15 голосов
/ 20 мая 2016

Текущий Django - 1,9, и вот некоторые обновления устаревшего принятого ответа

  1. use models.OneToOneField(User)
  2. add related_name='profile'
  3. use .__str__()и .format() для Python 3

примерно так

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)

Используя related_name, вы можете легко получить доступ к профилю пользователя, например, для request.user

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

Нет необходимости в дополнительных поисках.

15 голосов
/ 22 мая 2011

Django предоставляет способ хранения дополнительной информации о пользователях в отдельной таблице (называемой профилем пользователя).

10 голосов
/ 15 декабря 2013

Начиная с Django 1.5, вы можете заменить пользователя по умолчанию вашим пользовательским объектом, используя простую запись настроек:

AUTH_USER_MODEL = 'myapp.MyUser'

Для получения более подробной информации, проверьте эту запись в документации Django .

4 голосов
/ 02 ноября 2012

Я нашел решение здесь . По сути, вы просто расширяете стандартную форму UserCreationForm, но сохраняете то же имя. Он работает безупречно с тем, как документы Django говорят вам UserProfiles.

0 голосов
/ 29 августа 2017

Ответ может быть обновлен, чтобы добавить приемник сигнала, который создаст профиль, если он не существует, и обновит, если он уже существует.

@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()

Этот пост https://simpleisbetterthancomplex.com/tutorial/2016/11/23/how-to-add-user-profile-to-django-admin.html также содержит информацию о том, как редактировать, перечислять пользовательский профиль в админ-панели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...