Django 自定义用户模型

2025年3月17日 | 阅读 7 分钟

Django 提供了一个出色的内置用户模型和身份验证支持。 这是大多数开发人员更喜欢 Django 而不是 Flask、FastAPI、AIOHttp 和许多其他框架的主要原因。

但有时我们对 User 模型不满意,或者想根据项目需求进行自定义。 假设我们根本不再想要 username 字段。 或者我们想使用**用户的电子邮件**而不是默认的 **username**。 为此,我们需要自定义我们的默认 **Django User** 模型。

在本教程中,我们将从头开始构建 User 模型。 您应该记住的一件事是,自定义 Django 默认值会给复杂的系统增加很多复杂性。 所以尽量坚持使用默认的用户模型。 但对于项目需求,我们可以进行默认更改。

我们将使用 Django 内置的 AbastractBaseClass,它被自定义类名继承。

如果您是 Django 新手,请访问我们的 Django 教程

前提条件

  • 安装最新的 Django (2.2 +)
  • 创建 Django 项目
  • 进行基本配置
  • 创建虚拟环境

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

我们的第一步是使用以下命令在项目中创建一个应用程序。

该应用程序将在项目目录中创建。 现在将该应用程序注册到 settings.py 文件中。

MyUserModel/setting.py

2. 创建自定义用户的模型

现在我们将在 models.py 文件中创建自定义用户模型。 让我们看一下以下代码。

让我们理解上面的模型;我们创建了一个名为 CustomUser 的类,它继承了 AbstractbaseClass。 然后,我们添加了 email、is_staff、 is_activedate_joined 的字段。

  • username 设置为 none,因为我们希望通过其唯一的电子邮件 ID 而不是用户名来验证用户。
  • 如果允许用户登录到管理面板,则 is_staff 返回 true。
  • 如果用户当前处于活动状态,则 is_active 返回 true。 如果用户未激活,则不允许他/她登录。
  • USERNAME_FIELDS 定义了 User 模型的唯一标识 - 电子邮件。
  • 当我们使用 createsuperuser 命令创建 超级用户 时,REQUIRED_FIELDS 会提示这些字段。 它必须包含 blank 为 False 的任何字段。
  • manager 类对象指定类的所有对象都来自 CustomeUserManager。如果用户具有每个指定的权限,则 has_permission 返回 true。

3. 创建模型管理器

Django 提供了用户管理器的内置方法。 但是,如果我们正在创建自定义用户模型,我们需要覆盖默认方法。 创建一个新文件 managers.py(可能不同)并创建 User Model Manager。 以下方法由 BaseUserManager 提供。

我们创建了继承 BaseUserManager 的 CustomManagerClass。 它提供了以下辅助方法。

  • create_user() 方法创建、保存并返回 User。 它会自动将电子邮件转换为小写,并且返回的 User 对象将 is_active 设置为 true。
  • create_superuser() 方法将 is_staffis_active 设置为 True。
  • get_full_name() 返回用户的全名。
  • get_short_name 返回用户的 first_name

4. 将自定义用户注册到 setting.py

有必要将创建的自定义用户模型注册到 setting.py 文件中,否则 Django 会将其视为自定义用户模型。 它会抛出一个错误。 打开 setting.py 文件并注册您的自定义用户模型。

在我们的例子中,它将是 -

现在我们可以创建并应用迁移,这将创建一个使用自定义用户模型的新数据库。 让我们运行以下命令。

我们将获得如下所示的迁移文件。

正如我们所见,没有 username 字段,因为它在创建自定义用户模型时被删除了。

5. 创建超级用户

运行以下命令创建超级用户。

上面的命令将提示电子邮件和密码字段来创建超级用户。

Email address: [email protected]
Password:
Password (again):
Superuser created successfully.

创建表单以存储用户信息

我们将使用默认的子类 UserCreationForm forms 创建一个表单,以便他们可以使用自定义用户模型。

让我们在“MyUserModel”中创建一个 forms.py 文件。

forms.py

CustomUserCreationForm 类继承了 UsecreationForm,它由三个字段组成 - username、password1 和 password2。 如果两个密码匹配,则 password1 与 password2 匹配,validate_password() 验证密码并使用 set_password() 设置用户的密码。 密码将以哈希格式保存。

现在我们将自定义管理面板。

自定义管理面板

默认的管理面板非常有用,可以有效地安排信息,但我们可以通过提供所需信息来使其以我们想要的方式呈现。 让我们看看管理面板的以下代码。

admin.py

现在我们准备创建新用户。 运行以下命令并使用超级用户凭据登录到管理面板。

Django Custom User Model

一旦我们登录到管理面板。 我们看到 ADD CUSTOM USER 按钮,可以在其中创建新用户。

Django Custom User Model

创建一些用户后,管理面板将如下所示。

Django Custom User Model

结论

Django 以其内置功能而闻名,这节省了开发人员的大量时间。 但有时我们需要内置模型中不可用的功能。 但是,我们可以用自己的方式创建它们。 在本教程中,我们通过扩展 AbstractBaseClass 创建了自定义用户模型。 我们创建了管理器类来管理用户对象。 您可以在本教程的帮助下创建一个新的自定义用户模型。 您可以为用户提供更多权限,并可以创建功能齐全的用户模型。