使用django建站,需要使用django自带的用户授权和管理功能,又需要自定义用户模型,于是继承并重载了默认用户模型的属性,记录如下。
在settings.py中:
# 指定默认用户模型为自定义的模型
AUTH_USER_MODEL = 'mysite.User'
在models.py中:
from django.contrib.auth.models import AbstractUser, UnicodeUsernameValidator
class User(AbstractUser):
username_validator = UnicodeUsernameValidator()
username = models.CharField('用户名', max_length=20, unique=True, default='', validators=[username_validator])
password = models.CharField('密码', max_length=128, default='')
phone = models.CharField('手机号', primary_key=True, max_length=11, default='')
# 这里重载了默认的主键,默认的主键是email
EMAIL_FIELD = 'phone'
REQUIRED_FIELDS = ['phone']
def __str__(self):
return '%s, %s' % (self.username, self.phone)
class Meta(AbstractUser.Meta):
swappable = 'AUTH_USER_MODEL'
或者更彻底的自定义:
from django.db import models
from django.contrib.auth.base_user import AbstractBaseUser
class UserManager(models.Manager):
use_in_migrations = False
def create_user(self, **extra_fields):
user = self.model(**extra_fields)
user.set_password(extra_fields['password'])
user.save(using=self._db)
# Do something ...
return user
class User(AbstractBaseUser):
username = models.CharField('用户名', max_length=100, primary_key=True)
USERNAME_FIELD = 'username'
objects = UserManager()
def __str__(self):
return self.username
class Meta:
verbose_name = 'user'
verbose_name_plural = 'users'