官方文档里给了两种方法django
1.建立一个Model,而后用一对一外键指到User,这样就至关因而扩展了User,简单又实用。app
可是这样无法自定义User的save和delete函数(固然你直接去改django源码也是能够的,我以前就是这么干的,可是改源码这种事情实在是不靠谱),因此我就用了另外一种方法函数
2.直接新建一个CustomUser并‘覆盖’原来的User类spa
注意到django源码里User类的定义里有且只有一个swappable='AUTH_USER_MODEL'。个人理解是,这个设置能够指定另外一个类,让另外一个类来代替这个类。code
首先在model.py里建立一个新的类CustomUser,而后去setting里添加以下字段:blog
#个人app名为blog AUTH_USER_MODEL = 'blog.CustomUser'
这样一来,django把全部对User的操做都转移到了咱们本身定义的CustomUser类上。ip
而后在blog的model.py里的代码以下:rem
from django.db import models from django.contrib.auth.models import AbstractUser import os class CustomUser(AbstractUser): location = models.CharField(max_length=100, blank=True, null=True) description = models.CharField(max_length=300, blank=True, null=True) avatar = models.ImageField(upload_to='avatars/', default='default/default.jpg', max_length=100) def __str__(self): return self.username def delete(self, *args, **kwargs): path = self.avatar.path if path: os.remove(path) super(CustomUser, self).delete(*args, **kwargs)
我扩展了三个字段:地址、我的简介和头像。文档
而且可以随意自定义save和delete函数。源码
注:不要轻易覆盖save函数,由于django对User的save的调用实在是太频繁了,就算是登陆,也会调用一次save()(django的save和update都使用save())以修改用户的last_login,还有添加组或者修改权限的时候。你在save函数里的代码会被屡次调用。
这样一来,咱们建立了本身的CustomUser,而且是彻底代替了原来的User类(而不是建立了两个用于管理用户的Model)