Django 自定义用户模型2025年3月17日 | 阅读 7 分钟 Django 提供了一个出色的内置用户模型和身份验证支持。 这是大多数开发人员更喜欢 Django 而不是 Flask、FastAPI、AIOHttp 和许多其他框架的主要原因。 但有时我们对 User 模型不满意,或者想根据项目需求进行自定义。 假设我们根本不再想要 username 字段。 或者我们想使用**用户的电子邮件**而不是默认的 **username**。 为此,我们需要自定义我们的默认 **Django User** 模型。 在本教程中,我们将从头开始构建 User 模型。 您应该记住的一件事是,自定义 Django 默认值会给复杂的系统增加很多复杂性。 所以尽量坚持使用默认的用户模型。 但对于项目需求,我们可以进行默认更改。 我们将使用 Django 内置的 AbastractBaseClass,它被自定义类名继承。 如果您是 Django 新手,请访问我们的 Django 教程。 前提条件
在 Django 中创建自定义用户模型我们的第一步是使用以下命令在项目中创建一个应用程序。 该应用程序将在项目目录中创建。 现在将该应用程序注册到 settings.py 文件中。 MyUserModel/setting.py 2. 创建自定义用户的模型现在我们将在 models.py 文件中创建自定义用户模型。 让我们看一下以下代码。 让我们理解上面的模型;我们创建了一个名为 CustomUser 的类,它继承了 AbstractbaseClass。 然后,我们添加了 email、is_staff、 is_active 和 date_joined 的字段。
3. 创建模型管理器Django 提供了用户管理器的内置方法。 但是,如果我们正在创建自定义用户模型,我们需要覆盖默认方法。 创建一个新文件 managers.py(可能不同)并创建 User Model Manager。 以下方法由 BaseUserManager 提供。 我们创建了继承 BaseUserManager 的 CustomManagerClass。 它提供了以下辅助方法。
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 现在我们准备创建新用户。 运行以下命令并使用超级用户凭据登录到管理面板。 ![]() 一旦我们登录到管理面板。 我们看到 ADD CUSTOM USER 按钮,可以在其中创建新用户。 ![]() 创建一些用户后,管理面板将如下所示。 ![]() 结论Django 以其内置功能而闻名,这节省了开发人员的大量时间。 但有时我们需要内置模型中不可用的功能。 但是,我们可以用自己的方式创建它们。 在本教程中,我们通过扩展 AbstractBaseClass 创建了自定义用户模型。 我们创建了管理器类来管理用户对象。 您可以在本教程的帮助下创建一个新的自定义用户模型。 您可以为用户提供更多权限,并可以创建功能齐全的用户模型。 下一个主题Django 用户注册与电子邮件确认 |
我们请求您订阅我们的新闻通讯以获取最新更新。