django 为我们提供了强大的用户认证系统,并且提供了基于该系统的User模型,所以,很多时候,我们有必要对自己的user进行业务扩展,得到满足我们自己业务需求的user。借此,写下自己的感悟。
user内置属性如下:
username
用户名,必需字段。30个字符或更少,包含 _, @, +, . 和 - 字符。
first_name
可选。 <=30字符.
last_name
可选。 <=30字符r.
email
邮箱,可选。 Email地址.
password
密码,必需。Django不是以明文存储密码的,而是存储哈希值。
以及两个外键:
groups
用户组。
user_permissions
用户权限。
很明显,这些很多时候是不够用的。
但是,我学会了两种扩展方法。
第一种,很明显我们用一对一关系就可以扩展自己的属性了吧,比如,我想要加个address地址属性。
首先系统的User对象模型在django.contrib.auth.models里面,然后写自己的模型,建立一对一关系,我的代码如下
#app里面的models模块
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class UserProfile(models.Model):
user = models.OneToOneField(User)
address = models.CharField(max_length=100)
好makemigrations和migrate(关于迁移可以参考官方文档)进数据库先。
admin应该知道吧,让我看看到底长什么样,于是,在控制台python manage.py createsuperuser创建个admin。
长这样,当然不是我们希望的,这种扩展,不管用在什么时候,就算是自己对自己模型的扩展,也不是完美的,然而admin系统也提供了一些自定义的样式,应该说提供了很多。其中我们可以让两个模型一起显示吧。
#原来的admin.py文件
from django.contrib import admin
from blog.models import *
# Register your models here. admin.site.register(UserProfile)
这是原来的admin,我修改成这样
from django.contrib import admin
from blog.models import *
# Register your models here.
class ProfileInline(admin.StackedInline):
model = UserProfile
verbose_name = 'profile' class UserAdmin(admin.ModelAdmin):
inlines = (ProfileInline,) admin.site.register(User,UserAdmin)
register第二个参数我们传了UserAdmin,意思是用一个自定义的admin模型来修饰,具体细节官方文档有很多,用inlines 修饰,这里写一个inlne类进去,就像上面的ProfileInline一样,我们想要插入的是模型填了我们扩展的UserProfile.然后定意思了一个verbose_name,这是它的名字,好了现在admin变成什么样了,我来看一下。
对了,出错了,他说User已经注册了。所以我在admin.site.register上面加了一句admin.site.unregister(User),因为默认系统是注册了User对象。
好再看看,成功!
先上一页系统自己的row吧
然后看看是否有扩展:
可以看到我们自己的扩展地址:address栏,至此,也就扩展成功了。
第二张方法,django模型系统,自带继承,我们可以用继承来实现。
在models.py里面,我们写入如下模型,继承系统的AbstractUser
这种方法和系统User的耦合度非常好
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here. class User(AbstractUser):
address = models.CharField(max_length=100)
当然,系统默认还是自带的user,需要在setting文件里面把系统默认user替换写入如下语句
blog是我的app名字,根据自己app设置
然后在admin里面注册自己的User就行了。
看看效果如何:
address出现了,同时我们会发现这个User是在系统原来的User里的。