Login
网站首页 > 文章中心 > 其它

在Django中创建自己的自定义用户模型

作者:小编 更新时间:2023-08-16 14:54:59 浏览量:45人看过

在 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"变量,如下所示:


# 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中创建自己的自定义用户模型相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章