序
之前更改登录验证模式时返回的时Django自带的User model,当需要扩展业务而User model已经无法满足要求时,就需要扩展User类,收集后发现大致有三种方法进行User扩展。
查看User类
-
使用get_user_model()可以查看使用的user类
-
在Django shell中执行下列代码,即可查看当前使用的User类
from django.contrib.auth import get_user_model get_user_model()
AbstractUser
-
使用AbstractUser可以在使用Django自带的User类的所有属性前提下进行扩展,具体使用方法如下
-
继承AbstractUser并增加新属性
from django.contrib.auth.models import AbstractUser class NewUser(AbstractUser): shanyj = models.CharField(max_length=100)
-
在settings中进行设置,AUTH_USER_MODEL = “myapp.NewUser”
-
为了在admin界面中,方便使用,可在对应app的admin.py中加入
from .models import NewUser admin.site.register(NewUser)
AbstractBaseUser
-
AbstractBaseUser对User类进行了精简,只含有3个field: password, last_login和is_active. 如果你对django user model默认的first_name, last_name不满意, 或者只想保留默认的密码储存方式, 则可以选择这一方式.
-
AbstractBaseUser需要编写User model和UserManager方法
-
User model需要注意一下几点:
-
设置UserManager objects = UserManager(),UserManager()编写方法稍后介绍
-
设置USERNAME_FIELD,并且Field要有unique=True
-
设置get_full_name()方法
-
设置get_short_name()方法
class NextUser(AbstractBaseUser): shanyj = models.CharField(max_length=100,unique=True) a = models.CharField(max_length=25) is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=True) is_admin = models.BooleanField(default=False) objects = UserManager() USERNAME_FIELD = 'shanyj' def get_full_name(self): return self.shanyj def get_short_name(self): return self.shanyj
-
-
UserManager中需要重写两个方法,注意以下几点:
-
save()用到了using=self.db
-
需要有user.set_password(password)
-
user = self.model(shanyj=shanyj,…………)
-
-
需要编写create_user和create_superuser方法
class UserManager(BaseUserManager): def create_user(self, shanyj, password=None): if not shanyj: raise ValueError('Users must have an email address') user = self.model( shanyj=shanyj, ) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, shanyj, password=None): user = self.create_user(shanyj,password) user.is_admin = True user.save(using=self._db) return user
-
在settings中进行设置,AUTH_USER_MODEL = “myapp.NewUser”
User Profile
-
使用外键的方式来对用户的属性进行扩展,增加新的model如下:
class EasterProfile(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL) favorite_ice_cream = models.ForeignKey(Flavor, null=True, blank=True
-
我们可以使用user.easterprofile.favorite_ice_cream获取相应的profile (注意为小写)