from django.contrib.auth.models import User

Python 框架 Django 有一个内置的用户模型,如上所示,它具有许多使开发更快、更容易的特性,但是该模型有许多缺点,本文将简要讨论。

用户名字段区分大小写

即使用户名字段是唯一的,它也是区分大小写的,这使得它毕竟不是完全唯一的,这是一个问题。该模型会将用户名 Jane_DoeJANE_DOE 视为两个单独的用户名,这会提供糟糕的用户体验,因为人们不会期望 Jane_DoeJANE\ _DOE 是两个单独的用户名,如果您的应用提供的社交功能依赖于提供公共 URL 的用户名,这可能会带来安全风险。

邮箱字段不唯一

多个用户可以拥有与其帐户关联的相同电子邮件地址。 Django 的内置用户模型会将电子邮件 jerry@gmail.comJERry@gmail.com 识别为两个单独的电子邮件,即使按照惯例,所有电子邮件字符都应为小写,允许用户使用大写字符注册电子邮件并恢复默认使用的电子邮件地址的密码,这将是一种糟糕的用户体验。如果多个用户拥有相同的电子邮件地址,将启动所有帐户的密码重置,并且用户将收到每个活动帐户的电子邮件。

使用用户名作为登录参数

您希望用户登录是通过电子邮件而不是用户名完成的。人们倾向于使用完全不同的用户名或对不同程序略有不同的用户名,但对于大多数或所有这些帐户来说肯定是一封电子邮件,该用户比用户名更容易记住他/她的电子邮件。

如果您正在为生产开发程序,那么您不想使用 Django 的默认用户模型还有很多原因,您自己尝试一下,您会发现更多。现在是时候创建我们的自定义用户模型了。

第一步:创建用户模型

在您用户的应用程序models.py文件中,我们继承自AbstractBaseUserBaseUserManager。基本上,它们是我们可以用来扩展通用 Django 用户模型并创建自定义用户模型的类。

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

class Account(AbstractBaseUser):
    email = models.EmailField(verbose_name="email", max_length=60, unique=True)
    username = models.CICharField(max_length=30, unique=True)
    date_joined = models.DateTimeField(verbose_name='date_joined', auto_now_add=True)
    last_login = models.DateTimeField(verbose_name='last_login', 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 = ['username']
    objects = MyAccountManager()

    def __str__(self):
        return self.username

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

    def has_module_perms(self, app_label):
        return True

在上面的代码片段中,当创建自定义用户模型时,这些字段是必需的,如果需要,可以添加其他可选字段,例如first_namelast_name。您需要将用户名字段USERNAME_FIELD = 'email'设置为您希望用户能够登录的任何参数,这实际上困扰着我,我觉得 Django 不是很直观,可能有点令人困惑,但就是这样。必填字段REQUIRED_FIELDS = ['username']字面意思是必须提供的字段。

第二步:创建用户模型管理器

如果在 Django 中覆盖默认用户模型,则需要覆盖create_user()create_superuser()。基本上,我们正在定义我们希望在创建新用户和创建新超级用户时发生的事情,您应该阅读文档以获取更多信息。

class MyAccountManager(BaseUserManager):
    def create_user(self, email, username, password=None):
        if not email:
            return ValueError("Users must have an email address")
        if not username:
            return ValueError("Users must have a username")

        user = self.model(
            email=self.normalize_email(email).lower(),
            username=username,
            password = password,
        )

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, password):
        user = self.create_user(
            email=self.normalize_email(email),
            password = password,
            username = username,
        )
        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user

第三步:设置刚刚创建的模型

在你的项目基目录设置AUTH_USER_MODEL = 'account.Account'的settings.py文件中,这里的account是用户app的名称,Account是我们刚刚创建的模型。我们将覆盖 Django 提供的默认用户模型,并引用我们刚刚构建的模型。

第四步:我们迁移

最后,您需要转到您的终端和当前工作文件的位置,激活所需的虚拟环境并运行python manage.py makemigrationspython manage.py migratepython manage.py makemigrations准备将创建的模型转换为 sql 格式,然后python manage.py migrate提交这些更改。您现在可以createsuperuser并登录管理页面。

结论

Django 默认用户模型非常有用,可以为您节省大量代码和时间,但您希望该选项能够更改某些字段并能够操纵模型的行为以满足程序的需要所以创建自定义用户模型比使用默认用户模型更好,我们刚刚学习了如何创建它。

感谢您的阅读,我希望您发现这篇文章有用且内容丰富。 😊

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐