163.扩展User模型-一对一方式扩展
一对一外键
如果你对用户验证方法authenticate没有更多的要求,就是使用username和password就可以完成用户的登录验证工作,但是想要在原来的模型的基础上添加新的字段,那么就可以使用一对一外键的方式,定义一个用户的扩展模型,示例代码如下:
from django.contrib.auth.models import User
from django.db import models
from django.core import validators
from django.dispatch import receiver
import djang.db.models.signals import post_save
class UserExtension(models.Model):
<!--一对一的指定外键,如果使用foreignkey的外键形式进行引用,就会使表与表之间的关系并不是一对一的,有可能是多对多的,这样的话,在处理的时候就不太方便-->
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='extension')
telephone = models.CharField(max_length=11, validators=[validators.RegexValidator(r"1[345678]\d{9}"")])
school = models.CharField(max_length=100)
<!--定义一个信号,用于监听User模型是否使用了save()方法-->
@receiver(post_save, sender=User)
def handler_user_extension(sender, instance, created, **kwargs):
if created:
# UserExtension02的user必须是User的instance
# 不能是UserExtension02.objects.create(user=User)
UserExtension.objects.create(user=instance)
else:
# Manager isn't accessible via User instances 在views.py文件中为user.extension.telephone字段添加值时出现该错误:
# 原因就是将instance.extension.save()错误的写成instance.extension.save()
instance.extension.save()
需要注意的是,一定要将新创建的模型映射到数据库中。
(1)在views.py文件中为新创建的user扩展表添加一条数据,示例代码如下:
from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth.models import User
from .models import UserExtension
<!--1. 添加一条数据-->
def one_to_one(request):
user = User.objects.create_user(username='孤烟逐云', email='111111@qq.com', password='111111')
user.extension.telephone = '18833332222'
user.save()
return render(request, 'one_to_one.html')
(2)自定义登录的验证函数,采用扩展模型中的telephone和password字段验证。示例代码如下:
def my_authenticate(telephone, password):
user = User.objects.filter(extension__telephone=telephone).first()
if user:
<!--如果该手机号的用户存在,再判断输入的密码是否正确-->
is_true = user.check_password(password)
if is_true:
return user
print('您查找的用户是:%s' % user.username)
else:
return None
else:
return None
(3)调用定义好的登录验证函数,进行用户的验证,示例代码如下:
def one_to_one(request):
telephone = request.GET.get('telephone')
password = request.GET.get('password')
user = my_authenticate(telephone, password)
if user:
print('您查找的用户是:%s' % user.username)
context = {
'user': user
}
return render(request, 'one_to_one.html', context=context)
else:
context = {
'user': '您查找的用户不存在!'
}
return render(request, 'one_to_one.html', context=context)
在one_to_one.html中接收视图函数传递的上下文,示例代码如下:
<ul>
<li>用户名:{{ user.username }}</li>
<li>手机号{{ user.extension.telephone }}</li>
</ul>
163.扩展User模型-一对一方式扩展的更多相关文章
- 162.扩展User模型-使用Proxy模型
扩展用户模型: Django内置的User模型虽然已经足够强大了,但是有时候还是不能满足我们的需求,比如在验证用户登录的时候,它用的是用户名作为验证,而我们有时候需要通过手机号码或者是邮箱进行验证,还 ...
- ASP.NET Core 十种方式扩展你的 Views
原文地址:http://asp.net-hacker.rocks/2016/02/18/extending-razor-views.html 作者:Jürgen Gutsch 翻译:杨晓东(Savor ...
- Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素
Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...
- MDA模型定义及扩展
Tiny框架中.对模型本向没有不论什么强制性约束,也就是说你能够把不论什么类型的对象作为模型.也不必实现不论什么接口. 因此简单的说,你定义一个类.里面有一些描写叙述业务属性或处理的内容,就能够说它是 ...
- WPF 3D模型的一个扩展方法
原文:WPF 3D模型的一个扩展方法 在WPF 3D中,我们常常需要改变一个ModelVisual3D对象的颜色. 先说说ModelVisual3D,本质上3D模型都是由一个个的三角形构成的,并且经过 ...
- PHP数据库驱动扩展概述与不同方式连接数据库总结
Author:极客小俊 一个专注于web技术的80后 我不用拼过聪明人,我只需要拼过那些懒人 我就一定会超越大部分人! CSDN@极客小俊,CSDN官方首发原创文章 个人博客: cnblogs.com ...
- 微信小程序:app.json中通过使用扩展库userExtendedLib的方式,引入并使用weui
微信小程序 PK APP: 1.微信有海量⽤⼾,⽽且粘性很⾼,在微信⾥开发产品更容易触达⽤⼾:而推⼴app的成本太⾼. 2.微信小程序也可以跨平台(Android和IOS). 一.project. ...
- PHP 的扩展类型及安装方式
扩展类型 底层扩展(基于C语言): PECL 上层扩展(基于PHP 语言): PEAR Composer PECL # 查找扩展 $ pecl search extname # 安装扩展 $ pecl ...
- Chrome扩展开发之二——Chrome扩展中脚本的运行机制和通信方式
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
随机推荐
- 【转载】ibit-mybatis介绍
原文链接:ibit-mybatis介绍 概述 ibit-mybatis是一个Mybatis的增强工具,在Mybatis的基础上增加了新的特性与功能,志在简化开发流程.提高开发效率. 特性 无侵入 ...
- JS笔记之第二天
一元运算符:++ -- 分为前++和后++ and 前--和后-- 如果++在后面,如:num++ +10参与运算,先参与运算,自身再加1 如果++在前面,如:++num+10参与运算,先自身加1, ...
- sqldeveloper更改语言设定
\sqldeveloper\ide\bin\ide.conf 添加下面的 日语 AddVMOption -Duser.language=jaAddVMOption -Duser.country=J ...
- linux之定时任务调度
crond:任务调度 任务调度:是指系统在某个时间执行特定的程序或命令 任务调度分类: (1)系统工作,有些重要的工作必须周而复始地进行,如病毒扫描等 (2)个别用户工作:个别用户可能希望执行某些程序 ...
- Electron – 基础学习(2): 项目打包成exe桌面应用 之electron-packager
项目创建完成,启动正常,接下来就是项目打包了.将测试Demo打包成exe桌面应用,点击exe文件,运行项目. 书接上文,创建项目有三种方式 Git拷贝.直接创建:通过electron社群提供的命令行工 ...
- jQuery---小火箭返回顶部案例
小火箭返回顶部案例 1. 滚动页面,当页面距离顶部超出1000px,显示小火箭. 封装在scroll函数里,当前页面距离顶部为$(window).scrollTop >=1000 小火箭显示和隐 ...
- maven的核心概念——坐标
7.1 几何中的坐标 [1]在一个平面中使用x.y两个向量可以唯一的确定平面中的一个点. [2]在空间中使用x.y.z三个向量可以唯一的确定空间中的一个点. 7.2 Maven的坐标 使用如下三个向量 ...
- 剑指offer-面试题15-二进制中1的个数-位运算
/* 题目: 二进制中1的个数,例如9为1001,有2位1. */ /* 思路: 算法2: 左移unsigned类型flag=1,和n做&运算,当flag移动中1的位置与n对应位置也为1时,则 ...
- [POI2004]PRZ [枚举子集]
怎么全是 模拟退火 啊,这明明是个 枚举子集 的板子题. 考虑 \(n \leq 16\) 二进制没错了.. \(dt_i\) 表示 \(i\) 这个状态下 \(\max{t_j}\),\([\tex ...
- UVA12716-连续区间内反向寻因子法
在涉及的题目中如果需要使用连续区间内的数据的因数,可以放弃使用%这种低效的方案,从因数的角度进行,UVA12716中对于代码的优化就利用了这个小技巧. 原题:https://vjudge.net/pr ...