django 扩展User
环境
Python 3.5.1
django 1.9.1
前言
今天用django写web平台,第一时间想到django自带的认证,连session都提供好了,既然有轮子了,我们就不需要自己造了。
扩展django user的部分方法:
一、重写user,将新的user注册到admin,还要重写认证
二、继承user,进行扩展(记得在settings中设置AUTH_USER_MODEL
)
2.1 继承AbstractUser类
如果你对django自带的User model感到满意, 又希望增加额外的field的话, 你可以扩展AbstractUser类(本文就是这种方法实现)
新的django User类支持email,也可以用email作为用户登陆
2.2 继承AbstractBaseUser类
AbstractBaseUser中只含有3个field: password, last_login和is_active. 这个就是你自己高度定制自己需要的东西
model.py
admin.py
三、profile方式扩展,但是从django1.6开始就放弃这种写法
四、网上找的方法,不改源码、不加新表,扩展user
稍微解释一下这段代码: ProfileBase是自定义的一个元类,继承自types.ClassType
,其中ProfileUser为一个基类,其元类为ProfileBase,而ExtraInfo才是我们真正自定义字段的类,之所以把基类ProfileUser和ExtraInfo分开,是为了便于在其他地方引用ProfileUser,进行自定义扩展。简单说来,当解释器看到你在定义一个ProfileUser类的子类,而ProfileUser类的元类是ProfileBase,所以ExtraInfo的元类也是ProfileBase,在定义ProfileUser的子类的时候,它就会执行元类ProfileBase中的new中代码,并且将正在定义的类的(名字,基类,类属性)作为参数传递给new,这里的name就是类名ExtraInfo,attrs中则包含你新加的字段,通过User.add_to_class
把新的字段加入到User中,为了能在admin中显示出来,把它加入到UserAdmin.fieldsets
中,这样就能在后台编辑这个这个字段,当然,你也可以加入到ist_display,使之在列表中显示。
如果你有其他app也想往User Model中加field或方法,都只要通过子类ProfileUser类,然后使用声明语法进行定义即可,所有其他工作都有元类帮你完成。这也是所有django的model的内部工作,你可以用此方法扩展任何model。
转载出处:http://www.opscoder.info/extend_user.html
需求
注册登录都有现成的代码,主要是自带的User字段只有(email,username,password),所以需要扩展User,来增加自己需要的字段
代码如下:
model.py
settings.py
踩过的坑:
1、扩展user表后,要在settings.py 添加
2、认证后台要在settings添加,尤其记得加逗号,否则报错
认证后台不加的报错
没加逗号的报错
form.py
views.py