在 Django 中创建自己的自定义用户模型需要执行以下步骤:
- 创建一个新的 Django app
在项目的根目录下使用以下命令创建一个新的 Django 应用。
python manage.py startapp users
- 在新的应用中创建一个新的用户模型
在 users/models.py
文件中添加以下内容:
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
class CustomUserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
"""
Create and save a new User with the given email and password.
"""
if not email:
raise ValueError("Email cannot be empty")
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password, **extra_fields):
"""
Create and save a new superuser with the given email and password.
"""
extra_fields.setdefault("is_staff", True)
extra_fields.setdefault("is_superuser", True)
return self.create_user(email, password, **extra_fields)
class CustomUser(AbstractBaseUser):
email = models.EmailField(unique=True)
first_name = models.CharField(max_length=30, blank=True)
last_name = models.CharField(max_length=30, blank=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
date_joined = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = "email"
REQUIRED_FIELDS = ["first_name", "last_name"]
objects = CustomUserManager()
def __str__(self):
return self.email
def get_full_name(self):
return f"{self.first_name} {self.last_name}"
def get_short_name(self):
return self.first_name
在上面的示例中,我们创建了一个名为 CustomUser 的自定义用户模型,并拓展了 AbstractBaseUser 类。CustomUser 包含了 email, first_name, last_name, date_joined 和 一些用于身份验证的字段。我们同样创建了一个名为 CustomUserManager 的自定义用户管理器类,它包含了与创建和保存用户相关的方法。
重要的地方在于,我们使用了 USERNAME_FIELD 和 REQUIRED_FIELDS 属性,它们确保了 email 字段作为登录名,而 first_name 和 last_name 需要在创建用户时被提供。
- 在settings.py中定义AUTH_USER_MODEL
为了使用我们新创建的自定义用户模型,需要确保 Django 知道哪一个模型被用作用户模型。为此,请在 settings.py
文件中设置 AUTH_USER_MODEL
。
AUTH_USER_MODEL = "users.CustomUser"
- 定义迁移并更新数据库
你需要运行以下命令以对模型进行构建和创建迁移:
python manage.py makemigrations users
python manage.py migrate
运行以后你的数据库表将会在你的数据库里被创建。你可以在你的项目中使用 python manage.py shell
命令来进入 Django 的 shell,测试你的用户模型是否创建成功。
python manage.py shell
from users.models import CustomUser
# 新建一个用户
user = CustomUser(email="test@example.com", first_name="Test", last_name="User")
user.set_password("password")
user.save()
# 验证
CustomUser.objects.all()
现在你就可以使用自定义的用户模型了。
示例
假设我们需要为我们的博客网站创建一个自定义用户模型,我们需要在一个新的应用中添加一个 CustomUser 模型。我们的 CustomUser 模型将需要有一个带有名字,邮件地址和密码的构造函数。我们还需要添加一个名为 get_full_name() 的方法以返回用户的全名,以及一个名为 get_short_name() 的方法以返回用户的名字。
我们将创建的 CustomUser 模型的代码示例如下所示:
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
class BlogUserManager(BaseUserManager):
def create_user(self, email, password=None, first_name='', last_name='', **extra_fields):
"""
Create and save a new User with the given email and password.
"""
email = BlogUserManager.normalize_email(email)
user = self.model(
email=email,
first_name=first_name,
last_name=last_name,
**extra_fields
)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password, **extra_fields):
"""
Create and save a new superuser with the given email and password.
"""
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
return self.create_user(email, password=password, **extra_fields)
class CustomUser(AbstractBaseUser):
email = models.EmailField(unique=True)
first_name = models.CharField(max_length=30, blank=True)
last_name = models.CharField(max_length=30, blank=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
date_joined = models.DateTimeField(auto_now_add=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = BlogUserManager()
class Meta:
verbose_name = 'user'
verbose_name_plural = 'users'
def __str__(self):
return self.get_full_name()
def get_full_name(self):
return f"{self.first_name} {self.last_name}"
def get_short_name(self):
return self.first_name
通过这个示例,我们可以了解到:
- 自定义模型需要自己的 UserManager 类(并非与原始 User.objects 不同的 UserManager 类)。
- 自定义模型依赖于 AbstractBaseUser 类,而不是内置 Django User 类。
- 自定义模型必须具有 USERNAME_FIELD 属性,指定将在此模型中用作身份验证登录的字段。
- REQUIRED_FIELDS 是需要在通过 User.objects.create_user() 创建对象时输入的额外字段列表。
使用自定义的用户模型后,我们需要更新 django 配置。
找到你的项目的设置文件,通常是
# settings.py
AUTH_USER_MODEL = 'yourapp.CustomUser'
替换 “yourapp” 中的文本与你的自定义用户模型的应用名称相同。接下来,可以通过 Django 的 Auth 服务进行身份验证。
示例:
from django.contrib.auth import get_user_model
User = get_user_model()
new_user = User.objects.create_user(email='admin@admin.com', password='adminadmin')
new_user.save()
我们首先导入了 get_user_model 函数,它返回所配置的自定义用户模型(例:users.views.CustomUser)的位置。
现在,我们可以使用 User 实例化一个新用户,就像在内置 Auth User 类中的 User 一样。然后我们需要使用用户实例保存对象。
现在,我们已将用户信息保存到数据库中。我们可以使用此身份验证来验证用户,就像使用内置用户模型 Auth 服务的身份验证一样。
你可以在你的应用程序中的视图里使用之前的身份验证代码,来验证用户的身份。
from django.contrib.auth import authenticate, login
def login_view(request):
if request.method == "POST":
email = request.POST.get("email")
password = request.POST.get("password")
user = authenticate(request, email=email, password=password)
if user is not None:
login(request, user)
return redirect("/")
else:
messages.error(request, "Invalid email or password")
return render(request, "login.html")
在上面的示例中,我们使用用户提供的 email 和 password 进行身份验证。如果验证成功,我们使用 login()
函数将用户登录,然后重定向到主页。否则,我们显示错误消息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在Django中创建自己的自定义用户模型 - Python技术站