美文网首页Django
django用户认证系统——拓展 User 模型

django用户认证系统——拓展 User 模型

作者: 烂笔头2020 | 来源:发表于2020-05-26 11:19 被阅读0次

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息。对于 Django 内置的 User 模型, 仅包含以下一些主要的属性:
    username,用户名
    password,密码
    email,邮箱
    first_name,名
    last_name,姓
    对于一些网站来说,用户可能还包含有昵称、头像、个性签名等等其它属性,因此仅仅使用 Django 内置的 User 模型是不够。好在 Django 用户系统遵循可拓展的设计原则,我们可以方便地拓展 User 模型。

    继承 AbstractUser 拓展用户模型

    这是推荐做法。事实上,查看 User 模型的源码就知道,User 也是继承自 AbstractUser 抽象基类,而且仅仅就是继承了 AbstractUser,没有对 AbstractUser 做任何的拓展。以下就是 User 的源码:

    class User(AbstractUser):
        """
        Users within the Django authentication system are represented by this
        model.
    
        Username, password and email are required. Other fields are optional.
        """
        class Meta(AbstractUser.Meta):
            swappable = 'AUTH_USER_MODEL'
    

    所以,如果我们继承 AbstractUser,将获得 User 的全部特性,而且还可以根据自己的需求进行拓展。下面在自己的users/models.py下进行拓展:

    from django.db import models
    from django.contrib.auth.models import AbstractUser
    
    
    class User(AbstractUser):
        nickname = models.CharField(max_length=50, blank=True)
    
    
        class Meta(AbstractUser.Meta):
            pass
    

    我们给自定义的用户模型新增了一个 nickname(昵称)属性,用来记录用户的昵称信息,设置 blank=True 的目的是让用户在注册时无需填写昵称。这里可以根据自己的需要进行进一步的拓展,同时,我们继承了 AbstractUser 的内部类属性 Meta ,不过目前什么也没做。在这里继承 Meta 的原因是在你的项目中可能需要设置一些 Meta 类的属性值,不要忘记继承 AbstractUser.Meta 中已有的属性。

    注意:
    一定要继承 AbstractUser,而不是继承 auth.User。尽管 auth.User 继承自 AbstractUser 且并没有对其进行任何额外拓展,但 AbstractUser 是一个抽象类,而 auth.User 不是。如果你继承了 auth.User 类,这会变成多表继承,在目前的情况下这种继承方式是不被推荐的。此外,AbstractUser 类又继承自 AbstractBaseUser,前者在后者的基础上拓展了一套用户权限(Permission)系统。因此如非特殊需要,尽量不要从 AbstractBaseUser 拓展,否则你需要做更多的额外工作。为了让 Django 用户认证系统使用我们自定义的用户模型,必须在 settings.py 里通过 AUTH_USER_MODEL 指定自定义用户模型所在的位置,即需要如下设置(setting.py):

    # 其它设置...
    AUTH_USER_MODEL = 'users.User'
    

    定义好模型之后就要进行数据迁移

    相关文章

      网友评论

        本文标题:django用户认证系统——拓展 User 模型

        本文链接:https://www.haomeiwen.com/subject/imjmahtx.html