方式一:OneToOneField方式
该方式没有什么特别之处,就是一对一的两个表,创建User不一定创建扩展,他们只是外键关系,不再赘述
方式二:扩展User表
需求
如果你很满意默认User,只是想添加几个字段,那么使用这种方式即可。
目录结构
创建存放自定义User的包,目录结构如下
├── curr 自定义User所在包
│ ├── __init__.py
│ ├── models.py
├── manage.py
└── tuser
├── __init__.py
├── settings.py 配置文件
├── urls.py
└── wsgi.py
settings配置
INSTALLED_APPS = (
'curr' # 添加一行,添加该app
)
AUTH_USER_MODEL = 'curr.MyUser' # 本系统用户表(必须在app下的models.py文件,否则找不到Model)
自定义用户Model
在User所在包的models.py中添加
#coding:utf-8
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, AbstractUser
class User(AbstractUser):
# 继承AbstractUser,该Model和默认User的字段方法一样,只需要添加自己需要的字段即可
test = models.CharField(max_length=40) # 自定义的字段
创建完后在数据表auth_user中添加该字段
使用自定义User
使用时不能再from django.contrib.auth.models import User
- 创建其他Model的外键时可以如下
from django.conf import settings
class UserType(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL)
type = models.CharField(max_length=10)
或者
from curr.models import MyUser
class UserType(models.Model):
user = models.ForeignKey(MyUser)
type = models.CharField(max_length=10)
视图函数中使用时可以
from curr.models import MyUser
# 或者
from django.contrib.auth import get_user_model
get_user_model() # 该方法只在所有Model都已经加载完后使用
方式三:重写User表
需求
如果对默认User不满意,需要完全自定义(例如以phone为唯一标示,不以默认的username)
目录结构
同方式二
settings配置
同方式二
自定义用户Model
在User所在包的models.py中添加
# coding=utf8
import datetime
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.db import models
from django.db.models import F
from django.contrib.auth.models import User
from django.conf import settings
class MyUserManager(BaseUserManager):
"""
功能说明:自定义用户Model管理器
"""
use_in_migrations = True
def _create_user(self, username, password, **extra_fields):
"""
Creates and saves a User with the given username, email and password.
"""
now = datetime.datetime.now()
if not username:
raise ValueError('The given username must be set')
user = self.model(username=username, add_time=now, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
# 实现一下两个方法用于创建账号
def create_user(self, username, password=None, **extra_fields):
return self._create_user(username, password, **extra_fields)
def create_superuser(self, username, password, **extra_fields):
return self._create_user(username, password, **extra_fields)
class User(AbstractBaseUser):
"""
功能说明:自定义用户
"""
username = models.CharField(u"帐号/用户名", max_length=30, unique=True)
name = models.CharField(u"姓名", max_length=30)
phone = models.CharField(u'手机', max_length=11)
add_time = models.DateTimeField(u'创建时间')
objects = MyUserManager() # 设置自定义的相应管理器
USERNAME_FIELD = 'username' # 必须(用户唯一标示字段)
REQUIRED_FIELDS = ['add_time', 'name'] # 必须(不能缺省字段)
class Meta:
db_table = "auth_user" # 定义数据表名
创建完后在数据表auth_user中添加该字段
使用自定义User
同方式二