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里的。

django学习日志之自定义用户扩展的更多相关文章

  1. Django学习笔记(16)——扩展Django自带User模型,实现用户注册与登录

    一,项目题目:扩展Django自带User模型,实现用户注册与登录 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册,登录,用户认证,注销,修改密码等功能. ...

  2. Django学习手册 - 初识自定义分页

    核心: <a href='http://127.0.0.1:8000/index-%s'>%s<a> 自定义分页 1.前端处理字符 后端的字符  return render(r ...

  3. Django学习系列10:保存用户输入——编写表单,发送POST请求

    要获取用户输入的待办事项,发送给服务器,这样才能使用某种方式保存待办事项,然后在显示给用户查看. 上次运行测试指出无法保存用户的输入.现在,要使用HTML post请求. 若想让浏览器发送POST请求 ...

  4. Django学习路13_创建用户登录,判断数据库中账号名密码是否正确

    在 models.py 中设置数据库表的信息 from django.db import models # Create your models here. class User(models.Mod ...

  5. Django学习(五)---模板扩展,开发博客页面

    (一)博客主页面开发 1.模板中可使用for循环,语法格式为: {% for xs in xxs %} HTML语句 {% endfor %} 2.更改app下的views.py, 获取后台model ...

  6. Django学习笔记(9)—— 开发用户注册与登录系统

    一,项目题目: 开发用户注册与登录系统 该项目主要练习使用Django开发一个用户注册与登录的系统,通过这个项目然后巩固自己这段时间所学习的Django知识. 二,项目需求: 开发一个简单的用户登录与 ...

  7. Django学习笔记(18)——BBS+Blog项目开发(2)主体思路及流程

    这篇博客主要完成一个BBS+Blog项目,那么主要是模仿博客园的博客思路,使用Django框架进行练习. 准备:项目需求分析 在做一个项目的时候,我们首先做的就是谈清楚项目需求,功能需求,然后才开始写 ...

  8. Windows phone 自定义用户控件(UserControl)——ColorPicker

    编码前 学习Windows phone自定义用户控件,在<WPF编程宝典>学习的小例子.并根据windows phone稍微的不同,做了点修改.ColorPicker(颜色拾取器):拥有三 ...

  9. Django学习笔记(13)——Django的用户认证(Auth)组件,视图层和QuerySet API

    用户认证组件的学习 用户认证是通过取表单数据根数据库对应表存储的值做比对,比对成功就返回一个页面,不成功就重定向到登录页面.我们自己写的话当然也是可以的,只不过多写了几个视图,冗余代码多,当然我们也可 ...

随机推荐

  1. Demo12SimpleAdapter

    /Users/alamps/AndroidStudioProjects/Demo12SimpleAdapter/Demo12SimpleAdapter/src/main/res/layout/data ...

  2. oracle的系统文件的查询

    1:查看实例和数据库的相关信息 --查看实例 select instance_name,version,status,archiver,database_status from v$instance; ...

  3. LIKE 某个变量

    declare i ); n number; begin i:='%D0FC02EAR11005%'; select po_header_id into n from po_headers_all w ...

  4. cf-282e

    “字典树”的变形,任意两数异或最大值,处理字典树的时候可以用递归,也可以用循环,下面有两个版本. C - Sausage Maximization Time Limit:2000MS Memory L ...

  5. viewpager+fragment+HorizontalScrollView

    xml布局 <RelativeLayout        android:id="@+id/rl_column"        android:layout_width=&q ...

  6. 【python cookbook】【字符串与文本】11.从字符串中去掉不需要的字符

    问题:在字符串的开始.结尾或中间去掉不需要的字符,比如说空格符 解决方案: 1.字符串开始或结尾处去掉字符:str.strip() 2.从左或从右侧开始执行去除字符:str.lstrip().str. ...

  7. 161028、Nginx负载均衡实现tomcat集群方案简要小结

    重点两部分:一.负载均衡二.tomcat集群 所谓tomcat集群,就是可以向外提供并行服务的多台机器,任何一台服务器宕机,其它服务器可以替代它向外提供服务,而不影响用户访问. Nginx是一个常用的 ...

  8. MySQL存储引擎中的MyISAM和InnoDB区别详解

    在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问.为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的默认数 ...

  9. 项目管理:CocoaPods建立私有仓库

    CocoaPods是iOS,Mac下优秀的第三方包管理工具,类似于java的maven,给我们项目管理带来了极大的方便. 个人或公司在开发过程中,会积累很多可以复用的代码包,有些我们不想开源,又想像开 ...

  10. Greenplum迁移到配置不同的GP系统

    要使用gp_restore或gpdbrestore并行恢复操作,恢复的系统必须与备份的系统具有相同的配置(相同数量的Instance).如果想要恢复数据库对象和数据到配置不同的系统(比如系统扩展了更多 ...