Профиль пользователя Django
При добавлении дополнительных полей в профиль пользователя, таких как местоположение, пол, работодатель и т.д., следует ли добавлять дополнительные столбцы в django.contrib.auth.models.User
и сохранять его там? Или мне нужно создать новую таблицу для сохранения информации о профиле пользователя?
Кроме того, когда пользователь загружает изображение профиля, должен ли я сохранять его в той же таблице? (Обратите внимание, что это не производственный сервер, я просто делаю это на своем локальном сервере, чтобы разобраться в этом). Спасибо вам
Ответы
Ответ 1
Вам нужно создать модель для профиля пользователя:
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'
Ответ 2
Концептуально OneToOneField похож на ForeignKey с уникальным значением = True, но "обратная" сторона отношения будет напрямую возвращать один объект. Это рекомендуемый способ расширения класса User.
class UserProfile(models.Model):
user = models.OneToOneField(User)
...
Ответ 3
Django предоставляет способ хранить дополнительную информацию о пользователях в отдельной таблице (называемый профилем пользователя).
Ответ 4
Текущее Django - 1.9, и вот некоторые обновления устаревшего принятого ответа
- использовать
models.OneToOneField(User)
- добавить
related_name='profile'
- используйте
.__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
Нет необходимости в дополнительных поисках.
Ответ 5
Начиная с Django 1.5 вы можете заменить пользователя по умолчанию своим пользовательским объектом с помощью простой записи настроек:
AUTH_USER_MODEL = 'myapp.MyUser'
Для получения более подробной информации просмотрите запись документации Django.
Ответ 6
Вот решение, которое я нашел здесь. В основном вы просто расширяете форму по умолчанию UserCreationForm
, но сохраняя одно и то же имя. Он прекрасно работает с тем, как Django сообщает вам сделать UserProfiles
.
Ответ 7
Ответ может быть обновлен, чтобы добавить приемник сигналов, который создаст профиль, если он не существует, и обновите его, если он уже существует.
@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 post также включает в себя редактирование, список настраиваемых профилей в панели администратора.