day-65Django

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

原文地址:https://www.cnblogs.com/klw1/p/11215767.html