初入Django4-User表字段自定义拓展

xiaoxiao2021-02-28  64

python-Django-User表字段自定义拓展 虽然Django这个强大的框架为我们做开发提供了各种有用的包与模块,但是总体来说这些东西都是通用的,有些时候我们任然需要自定义一些属性 示例场景: 用户认证之密码找回 由于User表封装了各种属性,为我们提供了很多功能,所以我放弃了之前自己写的用户认证的表单,选择试试使用User表来做这次的用户认证, 当我把用户注册与登陆模块写完的时候,一切都顺利无比,我对Django自带表越来越喜欢,于是选择再次仔细研究一下User表的源码。仔细看看, 发现框架自带的东西,确实在某些方面比自己想的要周到的多。之后继续最后一个模块,密码找回。 密码找回我设计了如下步骤: 1、用户发送邮箱验证码  //说明:这个验证码我是采用产生token的方法,因为这个token是我在用户注册是自己写的一个模块,所以由于其安 全性很高,不容易被破解,所以我在这里就直接拿来用。 2、用户登陆邮箱拿到验证码,修改密码 在这里,问题就出现了。我登陆了邮箱,也拿到验证码,但是我修改密码的时候总是提示验证码错误。为什么?经过一番调试我发现, 原来问题就出在token上。在验证token的时候,发现token已经更新了,所以我想到了解决办法。在发送验证码的时候,我就把这个token 保存下来,在验证的时候,再取出来验证。好像一切都没有问题。开始行动 刚开始想得很简单,不就是一张表嘛,和之前在Django.db.moels 创建表一样,增加一个字段就行了嘛。 一切顺利,成功完成了找回密码模块。 没过几分钟问题就来了,我突然想到,这是项目在我的电脑上能够成功执行,那么移植到别人的电脑上或者上传到服务器的时候呢?版 本升级之后呢? 瞬间一个黑人问号!!! 那岂不是每次都要修改源码?犯了大忌啊 好吧,现在只能想办法不改变源码的情况下拓展User表字段了。终于是找到了官方推荐的方法,profile 第一步: 在app的models中创建一张新的表,利用OneToOneField方法与User关联起来。 user = models.OneToOneField(User)  注意:这里只能用user 第二步: 定义一个函数,用来保存字段 第三步: 调用post_save方法,关联到User表 前三步源码: from django.db import models from django.contrib.auth.models import User from django.db.models.signals import post_save class UserProfile(models.Model): user = models.OneToOneField(User) token = models.CharField(max_length=256, blank=True,default='-c(%e#a20(31u&q(o') def __str__(self): return self.token def __unicode__(self): return self.token def create_user_profile(sender,instance,created,**kwargs): if created: profile = UserProfile() profile.user = instance profile.save() post_save.connect(create_user_profile,sender=User) 第四步: 修改admin.py 源码 from django.contrib import admin from django.contrib.auth.models import User from django.contrib.auth.admin import UserAdmin from .models import UserProfile class ProfileInline(admin.StackedInline): model = UserProfile max_num = 1 can_delete = False class UserProfileAdmin(UserAdmin): inlines = [ProfileInline,] admin.site.unregister(User) admin.site.register(User,UserProfileAdmin) 其实这一步的主要目的是在为使用Django自带的后台时提供方便 第五步: 修改配置文件settings.py AUTH_PROFILE_MODULE = "你创建的app名字.UserProfile" python manage.py startapp test AUTH_PROFILE_MODULE = "test.UserProfile" 第六步: 执行命令保存到数据库 python manage.py makemigrations python manage.py migrate 好了,到这里就大工高成了,查看数据库会发现一张关联的User的表,并且有个user_id列,到这里基本上就结束 最后,使用的时候就和普通的ORM操作没什么区别了!
转载请注明原文地址: https://www.6miu.com/read-75531.html

最新回复(0)