zoukankan      html  css  js  c++  java
  • 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>
    
    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    for 续1
    8 解决多线程对共享数据出错
    7 多线程 全局变量
    6 线程threading
    5 多进程copy文件
    4 进程间通信Queue [kjuː]
    3 进程池
    2 进程multiprocessing [mʌltɪ'prəʊsesɪŋ] time模块
    1 多任务fork Unix/Linux/Mac
    16 pep8 编码规范
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12348120.html
Copyright © 2011-2022 走看看