当向用户配置文件添加额外字段时,如位置、性别、雇主等,我应该向django.contrib.auth.models.User
添加额外列并将其保存在那里吗?还是应该创建一个新表来保存用户配置文件信息?
另外,当用户上传个人资料图片时,我应该将其保存在同一表中吗?(请注意这不是生产服务器,我只是在本地运行服务器以解决问题)。谢谢。
当向用户配置文件添加额外字段时,如位置、性别、雇主等,我应该向django.contrib.auth.models.User
添加额外列并将其保存在那里吗?还是应该创建一个新表来保存用户配置文件信息?
另外,当用户上传个人资料图片时,我应该将其保存在同一表中吗?(请注意这不是生产服务器,我只是在本地运行服务器以解决问题)。谢谢。
你需要为用户配置文件建立一个模型:
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'
AUTH_PROFILE_MODULE
已被弃用。 - Flimmclass UserProfile
应该定义在哪个文件中?目前,我们的 class MyUser(AbstractBaseUser)
已经定义在 models.py
文件中。UserProfile
是否应该放在同一个文件中? - Cheok Yan Cheng从概念上讲,OneToOneField与带有unique = True的ForeignKey类似,但关系的“反向”端将直接返回单个对象。这是扩展User类的推荐方式。
class UserProfile(models.Model):
user = models.OneToOneField(User)
...
目前的Django版本为1.9,下面是对过时的被接受答案的一些更新:
models.OneToOneField(User)
related_name='profile'
.__str__()
和 .format()
如下所示:
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
无需额外查找。
答案可以更新以添加信号接收器,如果配置文件不存在,则创建配置文件,如果已存在,则进行更新。
@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文章还介绍了如何在管理面板中编辑和列出自定义配置文件。
当前的两个最佳答案已经过时。
如果您直接引用
User
(例如通过在外键中引用它),则您的代码将无法在将AUTH_USER_MODEL
设置更改为不同用户模型的项目中工作。[..] 不要直接引用User
[..] 当您定义对用户模型的外键或多对多关系时,应使用AUTH_USER_MODEL设置指定自定义模型。
from django.conf import settings
from django.db import models
class UserProfile(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name="userprofile",
)
https://docs.djangoproject.com/en/3.2/topics/auth/customizing/#referencing-the-user-model
from django.contrib.auth.models import User
request.user.profile