zoukankan      html  css  js  c++  java
  • django用户信息扩展

    Django封装了好多东西,拿来用就可以了,帮我们封装类用户的登录认证,用户的表
    所以Django自带有用户表,当扩展用户表后一些表就会被替换

    用户认证相关的    功能放在django.contrib.auth的一个app当中,在INSTALLED_APPS中可以看到
    主要处理用户信息,权限,认证


    Django遵循开闭原则
    所以不修改源代码,方便框架升级
    采用新增的方式继承源代码

    auth_user 里面的 
    is_staff 是否可以登录admin后台
    is_active账户是否激活,可以登录后台
    date_joined帐号创建时间
    last_login上一次登录的时间

    这些默认用户信息的引用库的位置 django.contrib.auth.models进行引用
    Djangocontribauthmodels.py里面

    配置完之后需要在settings.py里面进行设置
    AUTH_USER_MODEL = 'app.类名'

    采用Profile方式(关联的方式)进行用户信息扩展    
    生成的两张表,会从两张表中去查
    扩展的信息不会加到request.user(session)里面去。

    from django.contrib.auth.models import Userclass 
    Employee(models.Model):user = models.OneToOneField(User)
    department = models.CharField(max_length=100)
    采用AbstactUser方式扩展用户表
    生成用户表一张
    扩展的信息会加到request.user(session)里面去。
    权限机制也保存下来了
    class profile_user(AbstractUser):
        phone = models.CharField(max_length=30)
        qq = models.CharField(max_length=30)

        class Meta:
            db_table = 'profile_user'

    在User当中
    class Meta(AbstractUser.Meta):
    swappable = 'AUTH_USER_MODEL'
    所以采用继承的方式扩展用户字段需要在settings里面设置AUTH_USER_MODEL 'log.User'
    因为就有两个User model 了,所以需要说明

    clas Meta:
            db_table = 'profile_user'
    定义了表的名字,不会在数据表当中加上额外的字段
    User ->AbstactUser->AbstractBaseUser(基类) PermissionMixin(控制权限)

    abstract = True 表明为Django抽象类,在Meta当中加上这个使得这个model不会再数据库当中生成数据表

    AbstartUser还有一些方法可以给用户发送邮件

    objects = UserManager()    有创建创建用户和超级用户两个方法

    #采用email方式注册用户,删除first_namelast_name,添加phoneqq字段
    #
    这个时候可以继承基类,修改抽象类
    class profile_user(AbstractBaseUser,PermissionsMixin):
    email = models.EmailField(_('email address'), blank=True,unique = True) 这里需要添加unique,主键
    is_staff
    = models.BooleanField(
    _(
    'staff status'),
    default
    =False,
    help_text
    =_('Designates whether the user can log into this admin site.'),
    )
    is_active
    = models.BooleanField(
    _(
    'active'),
    default
    =True,
    help_text
    =_(
    'Designates whether this user should be treated as active. '
    'Unselect this instead of deleting accounts.'
    ),
    )
    date_joined
    = models.DateTimeField(_('date joined'), default=timezone.now)

    objects
    = UserProfileManager() 这里要定义登录superuser的username帐号,superuser

    USERNAME_FIELD
    = 'email' 这里定义存储帐号
    REQUIRED_FIELDS = [] 这里是必须要的帐号
    phone
    = models.CharField(max_length=30)
    qq
    = models.CharField(max_length=30)

    def get_full_name(self): 需要定义这里,改变登陆发方式后这里有所改变
    """
    Returns the first_name plus the last_name, with a space in between.
    """
    return self.email

    def get_short_name(self):
    "Returns the short name for the user."
    return self.email


    from django.contrib.auth.models import AbstractBaseUser,User,AbstractUser,
    UserManager,PermissionsMixin,BaseUserManager
    还需要导入各种的Model


    继承扩展用户这种方式需要在admin当中注册User
    from information.models import profile_user
    # Register your models here.

    admin.site.register(profile_user)



    from django.contrib.auth.models import AbstractUser

    # Create your models here.
    class User(AbstractUser):
    username = models.CharField(max_length=30, verbose_name='帐号')
    class Meta:
    verbose_name = '用户'
    verbose_name_plural = verbose_name

    像这种继承过来的,父类里面已经有username,子类就不能覆盖原有的username的字段了。

    扩展用户信息的方式。要么继承的方式,要么关联的方式。

     


























































  • 相关阅读:
    洛谷 P1077 摆花
    洛谷 P2323 [HNOI2006]公路修建问题
    2017.10.17 模拟赛
    【渗透测试小白系列】之BurpSuite爆破High级别的DVWA(含CSRF-Token防爆破程序)
    【漏洞复现】之sudo提权漏洞(CVE-2019-14287)复现
    【漏洞复现】Maccms潜藏后门分析复现
    杂乱的计算机网络基础
    简述数据库管理
    【漏洞复现】之微信DLL劫持反弹shell复现
    【渗透测试小白系列】之简单使用Ettercap实现DNS劫持
  • 原文地址:https://www.cnblogs.com/wuqingzangyue/p/5749599.html
Copyright © 2011-2022 走看看