Django封装了好多东西,拿来用就可以了,帮我们封装类用户的登录认证,用户的表
所以Django自带有用户表,当扩展用户表后一些表就会被替换
主要处理用户信息,权限,认证
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_name与last_name,添加phone与qq字段
#这个时候可以继承基类,修改抽象类
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的字段了。
扩展用户信息的方式。要么继承的方式,要么关联的方式。