想要创建自己的用户模型, 并希望Django的认证系统使用它, 需要按照以下步骤操作:
* 1. 创建自定义用户模型: 在应用的models.py文件中, 可以继承:
1.1 AbstractUser(如果你需要Django默认提供的所有字段).
1.2 AbstractBaseUser(如果你只需要自定义字段).
1.3 PermissionsMixin(如果你需要权限系统).
from django.contrib.auth.models import AbstractUser
class MyUser(AbstractUser):
some_field = models.CharField(max_length=100)
* 2. 设置AUTH_USER_MODEL:
在项目settings.py文件中, 找到INSTALLED_APPS设置并确保your_app'(应用名称)已经被添加进去.
然后, 添加或修改AUTH_USER_MODEL设置, 使其指向你的自定义用户模型.
例如, 如果你的应用名称是myapp并且自定义用户模型是MyUser, 则应该这样设置:
INSTALLED_APPS = [
'myapp',
'django.contrib.auth',
]
AUTH_USER_MODEL = 'myapp.MyUser'
在Django中, AUTH_USER_MODEL是一个在项目的settings.py文件中设置的重要变量,
它用于指定你想要用作Django认证系统(通常是用户模型)的自定义模型.
如果你打算使用Django提供的默认User模型, 那么不需要设置这个变量, 因为它已经有了默认值.
请注意, AUTH_USER_MODEL, 这个值不是一个完整的Python路径, 仅包括应用名称和模型名称, 两者之间用点号分隔.
详细说明: 在Django中, 当引用一个模型时, 通常不需要包含 models 部分,
因为Django有一个约定, 即模型类总是定义在应用的models.py文件中.
这个约定允许Django框架在内部简化模型的引用方式.
当设置AUTH_USER_MODEL为 'myapp.MyUser' 时, Django 将会做以下几件事:
1. 查找INSTALLED_APPS列表中名为myapp的应用.
2. 在该应用的models.py文件中查找名为MyUser的类.
3. 使用这个MyUser类作为默认的用户模型.
这里不需要models是因为Django已经知道要去哪里找模型了——它就在应用的models.py文件中.
如果包含了models(比如'myapp.models.MyUser'), Django会尝试从一个名为models的模块(而不是文件)中导入MyUser,
这会导致导入错误:
app_label, model_name = model.split(".") # 将配置按.切分
ValueError: too many values to unpack (expected 2) # 值错误: 要解压缩的值太多(预期为 2)
...
ValueError: Invalid model reference 'user.models.MyUser'.
String model references must be of the form 'app_label.ModelName'.
值错误:无效的模型引用 'user.models.MyUser'.
字符串模型引用必须是 'app_label.ModelName' 的形式.
所以, 'myapp.MyUser'是Django的一个约定俗成的写法, 用于引用在myapp应用的models.py文件中定义的MyUser模型.
这个约定简化了模型引用的语法, 并使Django框架更加易用.
* 3. 迁移数据库: 在修改了AUTH_USER_MODEL之后, 需要运行Django的迁移命令来更新你的数据库模式.
python manage.py makemigrations
python manage.py migrate
这将会为自定义用户模型创建必要的数据库表(如果它们还不存在的话).
* 4. 更新你的代码: 在代码中, 当需要引用用户模型时, 不要直接使用 django.contrib.auth.models.User,
而应该使用get_user_model()函数, 这个函数会返回在settings.py中设置的AUTH_USER_MODEL所指向的模型.
from django.contrib.auth import get_user_model
User = get_user_model()
user = User.objects.get(username='some_username')
确保遵循这些步骤, 这样Django的认证系统就会使用自定义用户模型了.