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

yizhihongxing

在 Django 中创建自己的自定义用户模型需要执行以下步骤:

  1. 创建一个新的 Django app

在项目的根目录下使用以下命令创建一个新的 Django 应用。

python manage.py startapp users
  1. 在新的应用中创建一个新的用户模型

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 需要在创建用户时被提供。

  1. 在settings.py中定义AUTH_USER_MODEL

为了使用我们新创建的自定义用户模型,需要确保 Django 知道哪一个模型被用作用户模型。为此,请在 settings.py 文件中设置 AUTH_USER_MODEL

AUTH_USER_MODEL = "users.CustomUser"
  1. 定义迁移并更新数据库

你需要运行以下命令以对模型进行构建和创建迁移:

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中创建自己的自定义用户模型 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Django在Win7下的安装及创建项目hello word简明教程

    下面我就为你详细讲解“Django在Win7下的安装及创建项目hello word简明教程”的完整攻略。 安装Django 安装Python:下载安装Python 3.x 版本,安装完成后记得勾选“Add Python to PATH”选项。 安装Django:在命令行界面(CMD)输入以下命令进行安装:pip install django 测试是否安装成功…

    Django 2023年5月16日
    00
  • Django 内置权限扩展案例详解

    这里是针对“Django 内置权限扩展案例详解”的完整攻略,包含两个示例说明的详细讲解。 1. 示例一 1.1 案例描述 假设我们要实现一个博客系统,需要实现以下功能: 所有用户都可以浏览博客列表和单篇博客。 未登录用户不能对博客进行任何操作(包括新建、修改、删除和点赞)。 登录用户可以进行以下操作: 创建自己的博客文章。 修改自己创建的博客文章。 删除自己…

    Django 2023年5月16日
    00
  • python+django快速实现文件上传

    现在我将为你详细讲解”使用Python+Django快速实现文件上传”的完整攻略,并且包含两条实例说明。 前言 文件上传是Web开发中必不可少的功能之一。对于Python和Django用户来说,使用Django提供的文件存储、表单处理等功能可快速实现文件上传。 1. 创建Django项目 首先,你需要安装Django并创建一个Django项目,你可以在这里找…

    Django 2023年5月16日
    00
  • 如何搜索查找并解决Django相关的问题

    当遇到 Django 相关的问题时,以下是搜索、查找并解决问题的完整攻略: 1. 确认问题 首先需要确认问题所在,是代码逻辑、环境配置,还是依赖的安装问题。可以从控制台、错误提示中确认问题的位置,再结合日志进行分析。 2. 在官方文档中查找解决方案 Django 官方文档是最权威、最全面的资源,在解决问题时应该跨度官方文档寻找答案。可以在 Django 官方…

    Django 2023年5月16日
    00
  • django– 配置media文件

    media文件夹是我们下载东西后存放数据的主要存放处..十分重要 一:配置media文件:  media的配置和static十分相似,但也有一些不同的地方 1,首先在应用里面创建media文件     2,在settings里面配置media文件的路径 在settings里面配置主要分为两步,和static相似 MEDIA_ROOT=os.path.join…

    Django 2023年4月12日
    00
  • Python django搭建layui提交表单,表格,图标的实例

    下面是关于“Python django搭建layui提交表单、表格、图标的实例”的完整攻略,包含两条示例说明。 一、搭建环境准备 安装Python及相关扩展:安装Python3.x及pip,安装Django框架、PyMySQL数据库连接器、Django-MySQL数据库引擎、xlwt模块。 安装layui:从官网下载Layui压缩包,将解压后的layui文件…

    Django 2023年5月16日
    00
  • Django——REST framework Django REST framework

    1. 什么是REST REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态 所有的数据,不过是通过网络…

    Django 2023年4月10日
    00
  • 教你如何将 Sublime 3 打造成 Python/Django IDE开发利器

    教你如何将 Sublime 3 打造成 Python/Django IDE开发利器 Sublime 3 是一款灵活且可扩展的文本编辑器,许多开发者都喜欢使用它来进行代码编写。如果你正在开发 Python 或 Django 项目,我们可以通过在 Sublime 3 中安装相应的插件以及做一些必要的配置,将其打造成一个强大的 Python/Django IDE …

    Django 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部