一尘不染

在Django中使用自定义字段扩展用户模型

django

用自定义字段扩展User模型(与Django的身份验证应用程序捆绑在一起)的最佳方法是什么?我也可能希望使用电子邮件作为用户名(用于身份验证)。


阅读 449

收藏
2020-03-25

共2个答案

一尘不染

做到这一点确实是Django推荐的方法是通过OneToOneField(User)属性。

扩展现有的用户模型

如果你希望存储与相关的信息User,则可以对包含其他信息字段的模型使用一对一关系。这种一对一模型通常称为配置文件模型,因为它可能存储有关站点用户的与身份验证无关的信息。

也就是说,扩展django.contrib.auth.models.User和替换它也可以…

替代自定义用户模型
某些项目可能具有身份验证要求,而Django的内置User模型并不总是适用于此。例如,在某些站点上,使用电子邮件地址代替你的用户名作为你的识别令牌更有意义。

[Ed:随后出现两个警告和一个通知,并指出这太过激烈了。]

我绝对不会在Django源代码树中更改实际的User类和/或复制和更改auth模块。

2020-03-25
一尘不染

注意:不建议使用此答案。如果你使用的是Django 1.7或更高版本,请参见其他答案。

这就是我的方法。

#in models.py
from django.contrib.auth.models import User
from django.db.models.signals import post_save

class UserProfile(models.Model):  
    user = models.OneToOneField(User)  
    #other fields here

    def __str__(self):  
          return "%s's profile" % self.user  

def create_user_profile(sender, instance, created, **kwargs):  
    if created:  
       profile, created = UserProfile.objects.get_or_create(user=instance)  

post_save.connect(create_user_profile, sender=User) 

#in settings.py
AUTH_PROFILE_MODULE = 'YOURAPP.UserProfile'

每当创建用户时,这将创建一个用户配置文件。然后,你可以使用

  user.get_profile().whatever
2020-03-25