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

在 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中使用MQTT的方法

    下面是在Django中使用MQTT的完整攻略: 1. 安装依赖 首先需要在Django项目中安装mqtt库,可以使用pip进行安装: pip install paho-mqtt 2. 创建MQTT客户端 在Django项目中创建一个mqtt_client.py文件,并编写如下代码: import paho.mqtt.client as mqtt class …

    Django 2023年5月15日
    00
  • django+Python数据库利用Echarts实现网页动态数据显示

    这几天一直在思考前端——服务器——数据库的之间的数据交互,最后决定了用django来做,为什么呢?因为我这只是在开发阶段,所以就用了django自带的web服务器(很方便)而且呢,它还自带了数据库sqllite3(好吧,本来要用mysql 的,但是平台测试接入尾声,docker都停掉了,而mysql在docker里面)这个数据库和mysql操作的django…

    2023年4月10日
    00
  • django学习第九天—raw查询原生sql和python脚本中调用django环境和ORM锁和事务

    在模型查询api不够用的情况下,我们还可以使用原始的sql语句进行查询 方式1 raw() raw()方法,返回模型的实例django.db.models.query.RawQuerySet 实例 这个RawQuerySet实例可以像一般的QuerySet那也,通过迭代来提供对象实例 #注意:raw()语句查询必须包含主键 ret = models.Book…

    Django 2023年4月12日
    00
  • django与vue的完美结合_实现前后端的分离开发之后在整合的方法

    下面将为你详细讲解“Django与Vue的完美结合——实现前后端的分离开发之后在整合的方法”。 1.前言 Django和Vue都是非常流行的Web开发框架,Django是一款开源的Python Web框架,Vue是一款渐进式JavaScript框架,常用于构建单页面应用(SPA)。在Web开发中,前端与后端的分离已经成为了主流趋势,而Django和Vue的完…

    Django 2023年5月16日
    00
  • Django的基本配置

    一、Django基本配置 1.新建app ​ 在项目目录中,即manage.py文件所在的目录执行下面代码: python manage.py startapp app 2.在项目中添加新建的app 找到settings.py文件在INSTALLED_APPS中添加自定义的app INSTALLED_APPS = [ ‘django.contrib.admi…

    Django 2023年4月10日
    00
  • 浅谈django orm 优化

    浅谈Django ORM 优化 Django ORM(对象关系映射)是Django的核心组件之一,用于在Python中简化数据库的CRUD操作。但是,在处理大量数据或复杂查询时,ORM的性能可能会变得缓慢。因此,本文将介绍在Django应用程序中使用ORM时可以使用的一些优化技巧。 延迟查询 当使用objects.get()或objects.filter()…

    Django 2023年5月16日
    00
  • Django时区详解

    Django时区详解 在Django中处理时区是一个十分重要的问题,它不仅只关系到我们的应用程序是否正确运行,还会影响到我们的用户和管理员关于时间的期望和需求。本文将详细讲解Django中时区的相关知识。 时区模型 Django的时区模型分为三种: UTC(Coordinated Universal Time)协调世界时(又称万有时),它是目前世界上最准确的…

    Django 2023年5月16日
    00
  • 使用Django2快速开发Web项目的详细步骤

    使用Django2快速开发Web项目的详细步骤可以分为以下部分: 安装Django2 使用Django2前需要先安装它。如果你没有安装Django2,可以使用如下命令进行安装: pip install Django==2.x.x (其中2.x.x为Django2的版本号) 创建Django2项目 在安装完Django2之后,可以使用django-admin …

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