Django用户个人资料

Dav*_*542 39 django django-models

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

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

Eze*_*uez 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
Run Code Online (Sandbox Code Playgroud)

然后配置settings.py:

AUTH_PROFILE_MODULE = 'accounts.UserProfile'
Run Code Online (Sandbox Code Playgroud)

  • -1使用ForeignKey而不是OneToOne,@ Dmitry有更好的答案.此外,AUTH_PROFILE_MODULE是Django 1.5+不需要的遗留设置 (8认同)
  • 也许值得一提的是,在这种情况下,OneToOne与User比ForeignKey(unique = True)更好. (7认同)
  • 不推荐使用`AUTH_PROFILE_MODULE`. (4认同)

Dmi*_*try 32

从概念上讲,OneToOneField类似于具有唯一= True的ForeignKey,但关系的"反向"侧将直接返回单个对象.这是扩展User类的推荐方法.

class UserProfile(models.Model):  
    user = models.OneToOneField(User)
    ...
Run Code Online (Sandbox Code Playgroud)


vic*_*vic 15

Django提供了一种在单独的表(称为用户配置文件)中存储有关用户的其他信息的方法.


C14*_*14L 15

目前Django是1.9,这里是对过时接受的答案的一些更新

  1. 使用 models.OneToOneField(User)
  2. related_name='profile'
  3. 使用.__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)
Run Code Online (Sandbox Code Playgroud)

使用related_name您可以轻松访问用户的个人资料,例如request.user

request.user.profile.location
request.user.profile.gender
Run Code Online (Sandbox Code Playgroud)

无需额外查找.


Nic*_*rdu 10

从Django 1.5开始,您可以使用简单的设置条目将默认用户替换为自定义用户对象:

AUTH_USER_MODEL = 'myapp.MyUser'
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请查看此Django文档条目.

  • 每个人都应该注意"auth"部分.头像和BIOS不应该在AUTH_USER_MODEL中.除非你想将kerberos这样的东西集成到你的用户身份验证中,否则我会坚持使用django.contrib.auth.与用户的一对一模型应该仍然是在Django 1.5+中做事的方式.似乎位置,性别,雇主不是有效的身份验证参数,不应该添加到自定义用户模型. (3认同)

小智 5

我在这里找到了一个解决方案。基本上,您只需扩展默认表单UserCreationForm但保持相同的名称即可。它与 Django 文档告诉您的方式无缝配合UserProfiles