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 linux 备份脚本

    #!/bin/sh # mysql data backup script # # use mysqldump --help,get more detail. # BakDir=/root/back/m ...

  2. spark sql cache

    1.几种缓存数据的方法 例如有一张hive表叫做activity 1.CACHE TABLE //缓存全表 sqlContext.sql("CACHE TABLE activity" ...

  3. 在C#中使用LOG4NET(winform程序

    http://www.csharpwin.com/csharpspace/678.shtml 1.下载log4net (Google log4net) 2.unzip log4net 3.运行VS,新 ...

  4. MVC4中下拉菜单和单选框的简单设计方法

    举例一: @Html.LabelFor(model => model.Gender) @Html.DropDownListFor(model => model.Gender, new[] ...

  5. 夺命雷公狗ThinkPHP项目之----企业网站20之网站前台头尾分离

    我们的网站直接让他头尾进行分离即可: 然后在代码里面找到id 为header的这段代码: 然后将整个div的内容都给弄出来,然后在view里面创建一个Public的目录,然后在创建一个header.h ...

  6. 6. 星际争霸之php设计模式--建造器模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  7. SQL——存储过程

    1. 为什么使用存储过程 应用程序通过T-SQL语句到服务器的过程是不安全的. 1) 数据不安全 2)每次提交SQL代码都要经过语法编译后在执行,影响应用程序的运行性能 3) 网络流量大 2. 什么是 ...

  8. SQL—— 事务

    SQL 事务: 1.  定义: 事务是作为单个逻辑单元执行的一系列操作. 多个操作作为一个整体向系统提交,要么执行.要么都不执行,事务是一个不可分割的工作逻辑单元.这特别适用于多用户同时操作的数据通信 ...

  9. 高并发应用中客户端等待、响应时间的推算,及RT/QPS概念辨析

    高并发应用中客户端等待.响应时间的推算,及RT/QPS概念辨析 对于一个网站,已知服务端的服务线程数和处理单个请求所需的时间时,该如何算出高并发时用户从点击链接到收到响应的时间?注意这个时间并不等于服 ...

  10. SqlServer 中如何查看某一个Sql语句是复用了执行计划,还是重新生成了执行计划

    我们知道SqlServer的查询优化器会将所执行的Sql语句的执行计划作缓存,如果后续查询可以复用缓存中的执行计划,那么SqlServer就会为后续查询复用执行计划而不是重新生成一个新的执行计划,因为 ...