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

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操作没什么区别了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值