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

我已经看到了一些方法,但不能决定哪一个是最好的。


当前回答

在Django 3.0+版本中非常简单(如果你不是在项目中):

在models.py

from django.db import models
from django.contrib.auth.models import AbstractUser

class CustomUser(AbstractUser):
    extra_field=models.CharField(max_length=40)

在settings.py

首先,注册你的新应用,然后在AUTH_PASSWORD_VALIDATORS下面 添加

AUTH_USER_MODEL ='users.CustomUser'

最后,在管理中注册你的模型,运行makemigrations和migrate,它将成功完成。

官方文档:https://docs.djangoproject.com/en/3.2/topics/auth/customizing/#substituting-a-custom-user-model

其他回答

下面是另一种扩展User的方法。 我觉得它比上面两种方法更清晰,简单,易读。

http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/

使用上述方法:

你不需要使用 user.get_profile()。Newattribute访问额外的信息 与用户相关 你可以直接访问 通过 user.newattribute

目前在Django 2.2中,当开始一个新项目时,推荐的方法是创建一个自定义的用户模型,它继承自AbstractUser,然后将AUTH_USER_MODEL指向该模型。

来源:https://docs.djangoproject.com/en/2.2/topics/auth/customizing/ using-a-custom-user-model-when-starting-a-project

简单而有效的方法是 models.py

from django.contrib.auth.models import User
class CustomUser(User):
     profile_pic = models.ImageField(upload_to='...')
     other_field = models.CharField()

像Pro一样扩展Django用户模型(UserProfile)

我发现这个非常有用:link

摘录:

from django.contrib.auth.models import User

class Employee(models.Model):
    user = models.OneToOneField(User)
    department = models.CharField(max_length=100)

>>> u = User.objects.get(username='fsmith')
>>> freds_department = u.employee.department

关于存储用户的附加信息,有一个官方建议。 Django手册也在Profiles部分讨论了这个问题。