在Django中创建自定义用户模型:从配置到迁移的完整指南

Luna
Luna
发布时间:2026-10-16| 5人浏览过
原创

本文详细介绍如何在Django项目中创建自定义用户模型,以支持使用电子邮件代替用户名进行登录。通过继承AbstractBaseUser和BaseUserManager,定义包含邮箱、姓名等字段的User类,并配置UserManager处理用户创建与密码哈希。文章涵盖项目初始化、应用创建、模型代码编写、settings.py配置以及数据库迁移命令,帮助开发者实现灵活的用户认证系统。

为什么需要自定义用户模型?

构建独立的自定义用户模型至关重要。若未来需要对用户数据结构进行调整,拥有自定义模型可大幅降低修改成本;反之,若依赖默认模型,则可能引发代码多处重构。在某些业务场景下,使用电子邮件而非用户名进行身份验证更为合理。因此,为程序员而言,掌握自定义用户模型的开发是一项必备技能。

本文将指导您根据具体需求构建自定义用户模型,请按照以下步骤操作。

  • Django 安装
  • 创建Django应用
  • 该应用程序的自定义模型
  • 迁移数据库

1. Django安装

完成Django环境配置后,进入已创建的工作目录。随后,通过以下命令初始化Django项目。

django-admin startproject mysite

2.创建Django应用

若您观察到某些网站采用类似/ accounts /格式的URL,这通常意味着其代码结构专业且规范。为此,我们需要创建一个名为accounts的应用程序,专门负责管理与账户相关的所有逻辑。在当前环境中,请使用以下命令创建Django应用。

python manage.py startapp accounts

应用创建完成后,将自动生成基础文件结构。

生成的文件目录结构如下所示:

accounts/
    __init__.py
    admin.py
    apps.py
    models.py
    tests.py
    views.py

所有数据库模型相关的代码均应编写在models.py文件中。此外,务必创建一个urls.py文件,以便通过账户应用路由链接。完成上述步骤后,我们将进入根据需求构建自定义用户模型的关键环节。

3.该应用程序的自定义模型

为创建自定义用户模型,需在models.py文件中编写以下代码,因为Python利用对象来管理和访问存储在数据库中的数据。

以下是models.py文件的完整代码:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser , BaseUserManager
import uuid


class UserManager(BaseUserManager):
    def create_user(self, email, firstname, lastname, phone,password=None):
        user = self.model(
            email = self.normalize_email(email),
            firstname = firstname,
            lastname = lastname,
            phone = phone,
        )
        user.set_password(password)
        user.save(using = self._db)
        return user

    def create_superuser(self, email,firstname,lastname,phone,password=None):
        user = self.create_user(
            email=email,
            password=password,
            firstname = firstname,
            lastname = lastname,
            phone = phone,
        )
        user.is_admin = True
        user.is_staff = True
        user.save(using=self._db)
        return user

class User(AbstractBaseUser):
    id = models.CharField(max_length=200, default=uuid.uuid4,unique=True,primary_key=True)
    email = models.EmailField(null=False, max_length=100,unique=True)
    firstname = models.CharField(null=False, max_length=100)
    lastname = models.CharField(null=False, max_length=100)
    phone = models.IntegerField(null=False,unique=True)
    date_joined = models.DateTimeField(auto_now=True)
    last_login = models.DateTimeField(auto_now=True)
    is_admin = models.BooleanField(default = False)
    is_active = models.BooleanField(default = True)
    is_staff = models.BooleanField(default = False)
    is_superuser = models.BooleanField(default = False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['firstname','lastname','phone']

    objects = UserManager()

    def __str__(self):
        return self.email + ", " + self.firstname

    def has_perm(self, perm, obj = None):
        return self.is_admin

    def has_module_perms(self, app_label):
        return True

User类定义了表的字段及结构,用于存储用户详细信息并施加特定约束。为管理User类,我们引入了UserManager,它用于创建普通用户或超级用户。正如前文所述,此处的用户名字段将被电子邮件取代,这比传统的用户名字段更具实际意义。同时,代码中明确列出了必填字段。通过指定电子邮件作为用户标识字段,系统会自动将电子邮件字段标记为必需项。

借助UserManager,我们可以创建新的普通用户和超级用户。user.set_password()方法会将纯文本密码转换为默认的哈希算法。Django框架使用PBKDF2结合SHA-256哈希算法,并具备密码扩展机制。user.save()函数负责使用指定字段和哈希后的密码保存创建的用户。创建自定义用户模型的过程相对简单。

需注意,在迁移模型之前请勿执行迁移操作。在创建模型后,必须使用自定义模型更新Django设置文件,否则Django将回退使用其内置的默认模型。只需在项目目录下的settings.py文件中添加以下代码即可。

AUTH_USER_MODEL = ‘accounts.User'

模型配置完毕后,接下来需将模型迁移至数据库。

4.迁移模型

现在,我们准备通过将更改迁移到数据库中来完成自定义用户模型的部署。在当前环境中,使用以下命令执行迁移并运行代码。

python manage.py makemigrations
python manage.py migrate

此命令将扫描Django项目中的所有模型及模型内的变更。若需针对特定应用程序进行迁移,可使用以下命令执行。

python manage.py makemigrations <app_name>
python manage.py migrate <app_name>

可将命令中的占位符替换为accounts,以仅对该应用程序执行变更。

至此,关于在Django中创建自定义用户模型的介绍已结束。如需了解更多Django中创建自定义用户模型的相关内容,请搜索本站历史文章或继续浏览后续文章。希望大家以后多多支持本站!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。