auth模块
准备工作:
1,在使用Django_admin的时候,
需要有auth_user表,所以需要执行用表模型生成表的那两个操作命令,不然没有auth_user表,然后用操作命令来注册
2.接着自己项目的注册登录..,使用的是Django_admin自带的auth_user表
由于auth_user表models里面并没有表模型,所以需要使用auth模块,来对数据库auth_user表的操作
from django.shortcuts import render, HttpResponse from django.contrib import auth 登录验证 def login(request): if request.method == 'GET': return render(request, "login.html") else: username = request.POST.get('username') pwd = request.POST.get('pwd') user_obj = auth.authenticate(request, username=username, password=pwd) #password,password是auth_user表中的key,这个操作是来判断用户名,密码是否和auth_user表中数据一致 #如果一致返回user_obj这个类,不一致返回null # 相当于 :models.AuthUser.objects.filter(username=username, password=pwd) print(user_obj.username, user_obj.password) #user_obj是一个类,可以有通过点方法来获得auth_user表里面的用户名,密码..数据 if user_obj: auth.login(request,user=user_obj) #这句话相当于完成下面操作: #1. 向客户端写cookiie #2. 向session表写session数据 #3. 生成了一个request.user(相当于request.session,在视图函数中使用) #后面可以点出来request.user.username, request.user.password, #以及session表中所有数据都能点出来 return HttpResponse('ok') else: return render(request, "login.html") 函数视图cookie验证 def index(request): username = request.user.username # 第一种判断用户是否登录 is_login = request.user.is_authenticated() # 第二种判断用户是否登录,返回bool类型 if is_login: return HttpResponse('index') else: return render(request, "login.html") from django.contrib.auth.decorators import login_required @login_required (login_url='/login/') # 第三种判断用户是否登录(如果登录走下面,没有跳转到'/login/'路由) def index2(request): return HttpResponse('index2') @login_required # 第三种判断用户是否登录的衍生 def index3(request): return HttpResponse('index3') #settings文件中 STATIC_URL='/STATIC/' LOGIN_URL='/LOGIN/'
其他功能的使用:
from django.contrib.auth.models import User #User就是auth_user这个表的表模型类 注册 def register(request): if request.method == 'GET': return render(request, 'register.html') else: username = request.POST.get('username') pwd = request.POST.get('pwd') User.objects.create_superuser(username=username, password=pwd, email='111@qq.com') #创建管理员 User.objects.create_user(username=username, password=pwd) #创建普通用户 #相当于: User.objects.create(username=username, password=pwd) return HttpResponse('successs') 修改密码 def modify(request): if request.method == 'GET': return render(request, 'modify.html') else: #登录成功才能修改密码 old_pwd = request.POST.get('old_pwd') res = request.user.check_password(old_pwd) #在session表中验证老密码,返回的是bool if res: new_pwd = request.POST.get('new_pwd') request.user.set_password(new_pwd) #设置新密码后,auth_user中的密码会改变,session表中的密码也会改变 request.user.save() return HttpResponse('ok') 安全退出(注销) def logout(request): # 删除session auth.logout(request) return HttpResponse('安全退出')
auth_user表添加新的列:
auth_user表添加列: - 一对一关联(不推荐) from django.contrib.auth.models import User class UserDetail(models.Models): phone = models.CharField(max_length=11) #要添加的列 user = models.OnoToOneField(to=User) #一对一关联User表 - 面向对象的继承(用继承重写User表) from django.contrib.auth.models import User,AbstractUser class UserInfo(AbstractUser): #数据库auth_user表变成app01_UserInfo这张表,并且auth模块同样适用这张表 phone = models.CharField(max_length=32) #要添加的列 #settings文件中 # 需要在配置文件中,指定我不再使用默认的auth_user表而是使用我自己创建的Userinfo表 STATIC_URL='/STATIC/' AUTH_USER_MODEL = "app01.UserInfo" #app名.models里面对应的模型表名
补充:related_name之反向查询起别名
一对多当中:
models
from django.db import models # Create your models here. class UserType(models.Model): title = models.CharField(max_length=32,null=True) class UserInfo(models.Model): username = models.CharField(max_length=32, null=True) age = models.CharField(max_length=32, null=True) ut = models.ForeignKey("UserType", null=True, related_name='xxx') #加在外键
views
from app01 import models def test110(request): ##################### 一对多 关系 ############# # 正向查询 res = models.UserInfo.objects.filter(username='小猴').first() print(res.ut.title) # 反向查询 #传统方式(表明小写_set.all()) res = models.UserType.objects.filter(id=2).first() print(res.userinfo_set.all()) ### 现代方式(releate_name = 'xxx') res = models.UserType.objects.filter(id=2).first() print(res.xxx.all()) #xxx相当于userinfo_set,但取名需要见名而义 return HttpResponse('ok')
多对多当中:
modles
class Boy(models.Model): name = models.CharField(max_length=32, null=True) class Girl(models.Model): name = models.CharField(max_length=32, null=True) class Boy2Girl(models.Model): b = models.ForeignKey("Boy", null=True, related_name='xxx') g = models.ForeignKey("Girl", null=True, related_name='yyy')
views
from app01 import models def test110(request): ############### 多对多 ############# # 创传统方式(表名小写_set) res = models.Boy.objects.filter(name='gouyang').first() b2g = res.boy2girl_set.all() for obj in b2g: print(obj.g.name) # 现代方式: res = models.Boy.objects.filter(name='gouyang').first() b2g = res.xxx.all() #先用xxx(找男生)找到 Boy2Girl表中的'gouyang'对应的对象,反之找女生用yyy for obj in b2g: print(obj.g.name return HttpResponse('ok')
多对多自关联
使用原因:
因为boy和girl字段基本相同, 因此可以写在一张表中, 通过gender来进行区分
自己写第三张表:
class User(models.Model): #自己关联自己 name = models.CharField(max_length=32, null=True) gender_choice = ( (1,'男'), (2,'女'), ) gender = models.IntegerField(choices=gender_choice, null=True) class U2U(models.Model): b = models.ForeignKey("User", null=True, related_name='xxx') #b代表男(前提表的写法自己规定好) g = models.ForeignKey("User", null=True, related_name='yyy') #g代表女(前提表的写法自己规定好)
# 查询和勾洋约会的女生 res = models.User.objects.filter(name='罗文', gender=1).first() objs = res.xxx.all() #反向查询,相当于: select * from app01_u2u where b_id=2 for obj in objs: print(obj.g.name) # 和蓉蓉约会的男生 res = models.User.objects.filter(name='蓉蓉', gender=2).first() objs = res.yyy.all() for obj in objs: print(obj.b.name)
不写第三张表:
需要自己定义的规则:
from_user_id(第三张表得到列名) : 男生id
to_user_id :(第三张表的列名): 女生
class User(models.Model): name = models.CharField(max_length=32, null=True) gender_choice = ( (1,'男'), (2,'女'), ) gender = models.IntegerField(choices=gender_choice, null=True) m = models.ManyToManyField("User")
#和罗文约会的女生 res = models.User.objects.filter(name='罗文', gender=1).first() objs = res.m.all() #用男生的名字根据第三张表查到自己表中约会的女生的对象 #先查的是这个列名from_user_id ''' 相当于: 1. seelct to_user_id from app01_user_m where from_user_id=2 ====> 5,6 2. select * from app01_user where id in [5,6] # 找到所有相亲女生 ''' for obj in objs: print(obj.name) #和品如约会的男生; res = models.User.objects.filter(name='品如', gender=2).first() objs = res.user_set.all() #表名小写_set #先查这个列名to_user_id ''' 相当于: 1. seelct from_user_id from app01_user_m where to_user_id=6 === >1,2 2. select * from app01_user where id in [1,2] ''' for obj in objs: print(obj.name)
一对多自关联
class Comment(models.Model): news_id = models.CharField(max_length=32) content = models.CharField(max_length=128) reply_id = models.ForeignKey("Comment") #关联的是自己的id
如下:
news(新闻表): 新闻内容 id content comment(评论表): 新闻id 评论内容 评论表的id #代表评论内容时给哪个评论内容留言 id news_id content reply_id 1 1 别逼逼 null 2 1 就逼逼 null #没人评论默认null 3 1 瞎比比 null 4 2 xxxxxx null 5 1 kkkkkk 2 6 1 llllll 1 显示效果: 第一条新闻: - 别逼逼 - llllll - 就逼逼 - kkkkkk - 瞎比比 第二条新闻: - xxxxxx
ps:
第一种对表的添加: models.Boy2Girl.objects.create(b_id=1, g_id=4)
第二种对表的添加: boy_obj = models.Boy.objects.filter(name='gouyang').first() #拿到对象 girl_obj = models.Girl.objects.filter(name='秀琴').first() models.Boy2Girl.objects.create(b=boy_obj, g=girl_obj) #模型表外键名=对象相当于b_id=1,g_id=4