用自定义字段扩展User模型(与Django的身份验证应用程序捆绑在一起)的最佳方法是什么?我也可能希望使用电子邮件作为用户名(用于身份验证)。
做到这一点确实是Django推荐的方法是通过OneToOneField(User)属性。
OneToOneField(User)
扩展现有的用户模型 …
如果你希望存储与相关的信息User,则可以对包含其他信息字段的模型使用一对一关系。这种一对一模型通常称为配置文件模型,因为它可能存储有关站点用户的与身份验证无关的信息。
User
也就是说,扩展django.contrib.auth.models.User和替换它也可以…
django.contrib.auth.models.User
替代自定义用户模型 某些项目可能具有身份验证要求,而Django的内置User模型并不总是适用于此。例如,在某些站点上,使用电子邮件地址代替你的用户名作为你的识别令牌更有意义。
[Ed:随后出现两个警告和一个通知,并指出这太过激烈了。]
我绝对不会在Django源代码树中更改实际的User类和/或复制和更改auth模块。
注意:不建议使用此答案。如果你使用的是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