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. MYSQL数据库自动本地/异地双备份/MYSQL增量备份

    构建高安全电子商务网站之(网站文件及数据库自动本地/异地双备份)架构图 继续介绍Linux服务器文件备份,数据库备份,数据安全存储相关的电子商务系统架构.针对安全性有多种多样的解决方案,其中数据备份是 ...

  2. demo05

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...

  3. android中获取打气筒的几种方式

    1,简单说明,打气筒就是将我们的xml布局转换为我们的view对象,不扯远了,直接看代码 A:从context中获取 LayoutInflater inflater1 = LayoutInflater ...

  4. C#写好的类库dll怎么在别人调用的时候也能看到注释?

    菜单 Project -> 'xxxx' Properties -> Build -> Output -> 勾上 XML Documentation file

  5. LDA-math-MCMC 和 Gibbs Sampling

    http://cos.name/2013/01/lda-math-mcmc-and-gibbs-sampling/ 3.1 随机模拟 随机模拟(或者统计模拟)方法有一个很酷的别名是蒙特卡罗方法(Mon ...

  6. C# 时间现实问题(12小时制与24小时制)

    最近在修改项目中遇到时间问题,12小时制与24小时制的问题,想再次跟各位同仁提个醒. yyyy-MM-dd HH:mm:ss------大写的HH为24小时制 yyyy-MM-dd hh:mm:ss- ...

  7. 由 "select *" 引发的“惨案”

    今天凌晨做发布, 要合并多个分数据库的表数据到主数据库中, 有 30+ 分数据库. 前面都比较顺利, 在临近结束时,突然发现一个字段的值插入错误. 有一个表 T,字段分别为 (f1, f2, f3, ...

  8. MAC常用快捷键

    1.F11 用于当前界面与桌面进行切换,Command-M 最小化窗口,Option-Command-M 最小化所有窗口,Command-数字 切换数字指定的网页列表 Shift-Command-D ...

  9. java中使用反射往一个泛型是Integer类型的ArrayList中添加字符串,反射的案例1.

    //------------------------- //废话不多说,直接上代码.代码里面添加了详细的解释. import java.lang.reflect.Constructor; import ...

  10. Java中类方法与实例方法的区别

    实例方法可以对当前对象的实例变量进行操作,也可以对类变量进行操作,但类方法不能访问实例变量.实例方法必须由实例对象来调用,而类方法除了可由实例对象调用外,还可以由类名直接调用. 另外,在类方法中不能使 ...