Django用户个人资料

时间:2011-05-21 23:16:06

标签: django django-models

在向用户个人资料中添加其他字段时,例如位置,性别,雇主等,是否应该向django.contrib.auth.models.User添加其他列并将其保存在那里?或者我应该创建一个新表来保存用户个人资料信息吗?

此外,当用户上传个人资料图片时,我应该将其保存在同一个表格中吗? (注意这不是一个生产服务器,我只是在我的本地运行服务器上执行此操作来解决问题)。谢谢

7 个答案:

答案 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,这里是对过时接受的答案的一些更新

  1. 使用models.OneToOneField(User)
  2. 添加related_name='profile'
  3. 对Python 3使用.__str__().format()
  4. 喜欢这样

    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帖子还包括如何编辑,在管理面板中列出自定义配置文件。