User模型扩展和自定义
Posted yitianyouyitian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了User模型扩展和自定义相关的知识,希望对你有一定的参考价值。
参考如下:
1. django 自定义用户user模型的三种方法
1.1 创建基于User
的proxy model,就是使用代理模型
1.2 使用abstractuser扩充fields
试验过,但是总是有报错,应该是哪里设置的问题。
复制代码 代码如下:
profiles/models.py from django.db import models from django.contrib.auth.models import AbstractUser from django.utils.translation import ugettext_lazy as _ # Create your models here. class KarmaUser(AbstractUser): karma = models.PositiveIntegerField(_("karma"),default=0,blank=True) settings.py AUTH_USER_MODEL = ‘profiles.KarmaUser‘
1.3.使用一对一关系将相关的模型一个个联系起来,扩充原来的User模型
这很像django 1.5之前的方式.很适用于创建第三方扩充包的场景,松耦合,不会破坏之前项目的结构.
需要此方法的场景:
- 在自己的django prj下,希望有多重user拥有各自很不相同的字段.或许希望有些用户组合起来一些用户的类型字段,并且希望能在模型层面上解决这些问题.
例子如下:
profiles/models.py
复制代码 代码如下:
from django.conf import settings from django.db import models from flavors.models import Flavor class EaterProfile(models.Model): # 默认用户资料 user = models.OneToOneField(settings.AUTH_USER_MODEL) favorite_ice_cream = models.ForeignKey(Flavor,null=True,blank=True) class ScooperProfile(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL) scoops_scooped = models.IntegerField(default=0) class InventorProfile(models.Model): user = models.OneToOneField(settings.AUTH_USER_MODEL) flavors_invented = models.ManyToManyField(Flavor,null=True,blank=True)
1.4.继承abstractbaseuser来替代原来的User模型
只有当你对usermodel里面的默认字段不满的时候才要使用,这个方法只保留了passwork,last_login,is_active三个字段。
参考官方文档:
https://docs.djangoproject.com/en/1.7/topics/auth/customizing/
个人认为在我的建站场景中,第二种最合适.正在测试是否可以用抽象类简化模型.待续...
以上3种方法各有优劣,大家根据自己的需求,自由选择吧。
2. OneToOneFiled的具体实现记录
1. 需求: 为了防止暴力破解,要求玩家连续登录5次错误之后帐号锁定10分钟(10分钟后自动解除锁定)。管理员可以手动解除锁定。
2. 做好的登录app目录如下:
3. 设计数据库 loginapp/models.py如下:
#-*- encoding:utf-8 -*-
from django.contrib.auth.models import AbstractUser
from django.contrib.auth.models import User
from django.db import models
import datetime
import django.utils.timezone as timezone
class Userotherstatus(models.Model):
user=models.OneToOneField(User,on_delete=models.CASCADE)
is_freezed=models.BooleanField(default=False,help_text=u"帐号是否被冻结")
freezed_time=models.DateTimeField(null=True,blank=True,help_text=u"帐号冻结的时间点")
pass_errnum=models.IntegerField(default=0,help_text=u"密码已经错误次数")
注意:通过 python manage.py migrate将models应用导数据库后,创建用户过后,User模型一对一的Userotherstatus模型对应的数据库表里面没有数据。
解决办法使用 django signal。当我们创建和更新用户实例时,Userotherstatus模块也会被自动创建和更新。
4. signal 实现如下:
参考: https://blog.csdn.net/qq_32506555/article/details/53219036
loginapp/signals.py
#-*- encoding: utf-8 -*- from django.db.models.signals import post_save from django.contrib.auth.models import User from .models import Userotherstatus from django.dispatch import receiver @receiver(post_save, sender=User) def creat_user_otherstatus(sender,instance,created,**kwargs): print "use signal creat" if created: Userotherstatus.objects.create(user=instance) @receiver(post_save, sender=User) def save_user_otherstatus(sender, instance, **kwargs): print (" use signal save") instance.userotherstatus.save() #
signal 信号注册:
loginapp/apps.py
# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.apps import AppConfig class LoginappConfig(AppConfig): name = ‘loginapp‘ def ready(self): import loginapp.signals
loginapp/__init__.py
default_app_config = ‘loginapp.apps.LoginappConfig‘
以上是关于User模型扩展和自定义的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security 自定义 UserDetailsService 和自定义 User 类