27_扩展User模型

扩展django的User模型

注意: 继承自AbstractUser和AbstractBaseUser的,要在settings.py 中指定: AUTH_USER_MODEL=‘app名称.模型名称‘

1. 继承自 AbstractUser

from django.db import models
from django.core import validators
from django.contrib.auth.models import AbstractUser, UserManager as _UserManager

class UserManager(_UserManager):
    """
    用户管理器
    """
    def create_superuser(self, username, password, email=None, **extra_fields):
        super().create_superuser(username=username, password=password, email=email, **extra_fields)

class User(AbstractUser):
    """
    重写(自定义)用户模型
    """
    mobile = models.CharField(max_length=11, verbose_name='手机号', help_text='手机号', unique=True, error_messages={'unique': '此手机号已经被注册'}, validators=[validators.RegexValidator(r'^1[34579]\d{9}$', message='请输入正确的手机号码格式')])
    email_active = models.BooleanField('邮箱状态,是否激活', default=False)

    REQUIRED_FIELDS = ['mobile']
    objects = UserManager()

    class Meta:
        db_table = 'tb_user'
        verbose_name = '用户'     # 在admin 站点中显示名称
        verbose_name_plural = verbose_name    # 复数形式

    def __str__(self):
        return self.username

2. 继承自 AbstractBaseUser和PermissionsMixin

from django.contrib.auth.validators import UnicodeUsernameValidator
from django.db import models
# from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, AbstractUser, BaseUserManager
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
from django.contrib.auth.models import PermissionsMixin
from django.core.validators import RegexValidator
from django.core.mail import send_mail

mobile_validator = RegexValidator(r'^1[3-9]\d{9}$', '手机号码格式不正确')

class UserManager(BaseUserManager):
    """定义用户管理器"""

    def _create_user(self, username, mobile, password, email, **extra_fields):
        if not username:
            raise ValueError('请输入用户名')
        if not mobile:
            raise ValueError('请输入手机号')

        user = self.model(username=username, mobile=mobile, email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)

        return user

    def create_user(self, username, mobile, password, email=None, **extra_fields):
        """创建普通用户"""
        extra_fields['is_superuser'] = False
        extra_fields.setdefault('is_staff', False)
        return self._create_user(username=username, mobile=mobile, password=password, email=email, **extra_fields)

    def create_superuser(self, username, mobile, password, email=None, **extra_fields):
        """创建超级管理员"""
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        # extra_fields['is_superuser'] = True
        return self._create_user(username=username, mobile=mobile, password=password, email=email, **extra_fields)

class User(AbstractBaseUser, PermissionsMixin):
    """用户模型"""
    username_validator = UnicodeUsernameValidator()
    username = models.CharField(
        '用户名',
        max_length=150,
        unique=True,
        help_text='用户名',
        validators=[username_validator],
        error_messages={
            'unique': '用户已存在,请重新输入',
        }
    )
    mobile = models.CharField(
        '手机号码',
        max_length=11,
        unique=True,
        help_text='手机号码',
        validators=[mobile_validator],
        error_messages={
            'unique': '手机号码已存在, 请重新输入',
            'max_length': '手机号码长度有误',
        })
    email = models.EmailField('邮箱', unique=True, help_text='邮箱', null=True)
    email_active = models.BooleanField('邮箱校验状态', default=False)
    is_staff = models.BooleanField(
        '是否员工,是就能够登录到后台',
        default=False,
        help_text='判断用户是否能够登录到后台admin站点',
    )
    is_active = models.BooleanField(
        '用户是否激活',
        default=True,
        help_text='用户是否激活(活动的),取消此选项,而不是删除用户'
    )
    date_joined = models.DateTimeField(
        '用户加入时间',
        auto_now_add=True
    )

    # 用户管理器
    objects = UserManager()

    EMAIL_FIELD = 'email'
    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['mobile']

    class Meta:
        db_table = 'tb_user'
        verbose_name = '用户'
        verbose_name_plural = verbose_name

    def clean(self):
        super().clean()
        self.email = self.__class__.objects.normalize_email(self.email)

    def email_user(self, subject, message, from_email=None, **kwargs):
        """Send an email to this user."""
        send_mail(subject, message, from_email, [self.email], **kwargs)

    def get_full_name(self):
        return self.username

    def get_short_name(self):
        return self.username

    def __str__(self):
        return self.username

注意:上述两种都要在settings.py文件中指定AUTH_USER_MODEL=‘‘app名.模型名, 不要忘记在settings.py中设置AUTH_USER_MODEL指向它。

2. 一对一外键

如果你对用户验证方法 authenticate 没有其他要求,就是使用 usernamepassword 即可完成。但是想要在原来模型的基础上添加新的字段,那么可以使用 一对一外键 的方式。示例代码如下:

# 一对一外键 扩展用户模型
from django.contrib.auth.models import User
from django.db import models
from django.dispatch import receiver
from django.db.models.signals import post_save

class UserExtension(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='extension')
    telephone = models.CharField(max_length=11, verbose_name='电话号码')
    birthday = models.DateField(null=True, blank=True, verbose_name='出生日期')
    school = models.CharField(max_length=20, verbose_name='学校')

@receiver(post_save, sender=User)
def create_user_extension(sender, instance, created, **kwargs):
    if created:
        UserExtension.objects.create(user=instance)
    else:
        instance.extension.save()

原文地址:https://www.cnblogs.com/nichengshishaonian/p/11576108.html

时间: 2024-11-06 10:33:55

27_扩展User模型的相关文章

.NET MVC4 实训记录之二(扩展WebSecurity模型下的UserProfile表)

使用VS2013创建MVC4项目后,自动生成的代码中默认使用WebSecurity模型创建用户管理,生成以下数据库: 用户信息只有ID和UserName,角色信息也只有两个基础字段.通常情况下这样的数据表不能满足我们的需求,因此对其进行扩展. 首先定义自己的用户信息.角色信息结构. 1 [Table("UserProfile")] 2 public class UserProfile 3 { 4 [Key] 5 [DatabaseGenerated(DatabaseGeneratedO

扩展XAF模型信息实现自定义功能

如何隐藏 web listview 的 编辑控制列如下图: 这列怎么让它隐藏? 感谢[少侠]XAF_杨东 提供解答!感谢XAF_小学生整理.   A: 注册自定义接口IModelListViewExtender 增加控制项 . 1.定义一个IModelListViewExtender接口. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ExpressA

django扩展User模型(model),profile

from django.contrib.auth.models import User # Create your models here. class Profile(models.Model): user = models.OneToOneField(User, related_name='profile') date_of_birth = models.DateTimeField(blank=True, null=True) photo = models.ImageField(upload

用于扩展目标跟踪的笛卡尔B-Spline车辆模型

(哥廷根大学) 摘要 文章提出了一种空间扩展物体轮廓的新颖表示,适用于跟踪采用激光雷达为测量数据的未知尺寸和方向的车辆.我们使用二次均匀周期的B-Splines直接表示笛卡尔空间中对象的星 - 凸形状近似.与之前在极空间中工作的方法相比,我们引入了一个新的步行参数来模拟物体的轮廓功能,使得形状参数被很好地被定义并且与测量值位于同一空间内.该方法的主要优点是可以通过缩放样条的基点来独立地执行长度和宽度的缩放. 一.引言 对于汽车领域,特别是高级驾驶辅助系统(ADAS)功能,扩展目标跟踪(EOT)的

18_django的用户模型和扩展django的用户模型

目录 User 模型 字段: User模型的基本用法 User 模型 User模型是这个框架的核心部分.他的完整的路径是在django.contrib.auth.models.User.以下对这个User模型做一个简单的了解: 字段: 内置的User模型拥有以下的字段: 1. username: 用户名.150个字符以内.可以包含数字和英文字符,以及_/@/+/.和-字符.不能为空,且必须唯一. 2. email: 邮箱. 可以为空. 3. password: 密码.经过哈希过后的密码. 4.

第二章 flume 的数据流模型

1. flume 的基本概念 本文中所有与 flume 相关术语都采用斜体英文表示,这些术语的含义如下所示. flume             一个可靠的,分布式的,用于采集,聚合,传输海量日志数据的工具. Web Server   一个产生 Events/数据 的客户端. Agent            flume 系统中的一个节点,它主要包含三个部件:Source, Channel, Sink. Event            事件,在 flume-agent 内部传输的数据结构.一个

如何使用机器学习解决实际问题-以关键词相关性模型为例

本文以百度关键词搜索推荐工具字面相关性模型为基础,介绍一个机器学习任务的具体设计实现.包括目标的设定,训练数据准备,特征选择及筛选, 以及模型的训练及优化.该模型可扩展到语意相关性模型,搜索引擎相关性及LTR学习任务的设计实现.该模型的设计调研实现,也可以很容易移植解决其他包括语义相关性的问题 目标设定:提升关键词搜索相关性 作为一个搜索+推荐产品,百度关键词搜索推荐系统的产品形态是向凤巢用户推荐适合他业务的关键词.例如一个卖鲜花的广告主,他想在百度上做关键词搜索推广时,需要提交和他业务相关的关

Django笔记 如何扩展User表的字段

django 自带的权限框架,其中auth_user表的字段,很难满足正常的需求,因此需要扩展,至于扩展,一般有如下几种选择: 1. 直接修改django 源码,修改User class 的定义,以及各种方法等,然后把数据库auth_user表里的字段扩展到与自己需求一致.(源代码在:django.contrib.auth.models import User),这种方式,每次升级django都得很小心. 2. 把django 的user以及认证部分的源代码拷贝到自己的app下面,然后修改,配置

搜索引擎的检索模型-查询与文档的相关度计算

1. 检索模型概述 搜索结果排序时搜索引擎最核心的部分,很大程度度上决定了搜索引擎的质量好坏及用户满意度.实际搜索结果排序的因子有很多,但最主要的两个因素是用户查询和网页内容的相关度,以及网页链接情况.这里我们主要总结网页内容和用户查询相关的内容. 判断网页内容是否与用户査询相关,这依赖于搜索引擎所来用的检索模型.检索模型是搜索引擎的理论基础,为量化相关性提供了一种数学模型,是对查询词和文档之间进行相似度计算的框架和方法.其本质就是相关度建模.如图所示,检索模型所在搜索引擎系统架构位置: 当然检