在向用户个人资料中添加其他字段时,例如位置,性别,雇主等,是否应该向django.contrib.auth.models.User
添加其他列并将其保存在那里?或者我应该创建一个新表来保存用户个人资料信息吗?
此外,当用户上传个人资料图片时,我应该将其保存在同一个表格中吗? (注意这不是一个生产服务器,我只是在我的本地运行服务器上执行此操作来解决问题)。谢谢
答案 0 :(得分:45)
您必须为用户个人资料制作模型:
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'
答案 1 :(得分:29)
从概念上讲,OneToOneField类似于具有unique = True的ForeignKey,但关系的“反向”端将直接返回单个对象。这是扩展User类的推荐方法。
class UserProfile(models.Model):
user = models.OneToOneField(User)
...
答案 2 :(得分:15)
Django提供了storing additional information about users in a separate table的方式(称为用户配置文件)。
答案 3 :(得分:15)
目前的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
无需额外查找。
答案 4 :(得分:10)
从Django 1.5开始,您可以使用简单的设置条目将默认用户替换为自定义用户对象:
AUTH_USER_MODEL = 'myapp.MyUser'
有关详细信息,请查看此Django documentation entry。
答案 5 :(得分:4)
我找到了here的解决方案。基本上你只是扩展默认格式UserCreationForm
但保持相同的名称。它与Django的文档告诉你做UserProfiles
的方式无缝协作。
答案 6 :(得分:0)
可以更新答案以添加信号接收器,如果信息不存在则会创建信息接收器,如果信息已存在则更新。
@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帖子还包括如何编辑,在管理面板中列出自定义配置文件。