django之重构用户表

一、django自定义用户表格式(3.0.0)

数据库:

Model类:

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    """
    An abstract base class implementing a fully featured User model with
    admin-compliant permissions.

    Username and password are required. Other fields are optional.
    """
    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        _(‘username‘),
        max_length=150,
        unique=True,
        help_text=_(‘Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.‘),
        validators=[username_validator],
        error_messages={
            ‘unique‘: _("A user with that username already exists."),
        },
    )
    first_name = models.CharField(_(‘first name‘), max_length=30, blank=True)
    last_name = models.CharField(_(‘last name‘), max_length=150, blank=True)
    email = models.EmailField(_(‘email address‘), blank=True)
    is_staff = models.BooleanField(
        _(‘staff status‘),
        default=False,
        help_text=_(‘Designates whether the user can log into this admin site.‘),
    )
    is_active = models.BooleanField(
        _(‘active‘),
        default=True,
        help_text=_(
            ‘Designates whether this user should be treated as active. ‘
            ‘Unselect this instead of deleting accounts.‘
        ),
    )
    date_joined = models.DateTimeField(_(‘date joined‘), default=timezone.now)

    objects = UserManager()

    EMAIL_FIELD = ‘email‘
    USERNAME_FIELD = ‘username‘
    REQUIRED_FIELDS = [‘email‘]

    class Meta:
        verbose_name = _(‘user‘)
        verbose_name_plural = _(‘users‘)
        abstract = True

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

    def get_full_name(self):
        """
        Return the first_name plus the last_name, with a space in between.
        """
        full_name = ‘%s %s‘ % (self.first_name, self.last_name)
        return full_name.strip()

    def get_short_name(self):
        """Return the short name for the user."""
        return self.first_name

    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)

二、如何重构这个用户表?

  我们在做用户注册和登录时,需要创建一个User表,如果这个用户表包含django自定义的所有字段再加上一个电话号码,那么我们自己再建一个User表包含我们所需的字段是

很麻烦的,有没有什么办法去重构这张表,最后迁移的时候直接生成我们重构够的表?

models.py

from django.db import models
from django.contrib.auth.models import AbstractUser
from django.core import validators

# 在这里重构了django默认的用户表后,还要通知django,使用我重构后的表,需要在设置中声明
# AUTH_USER_MODEL = ‘user.User‘  应用名.类名

# 继承AbstractUser类
class User(AbstractUser):
    phone = models.CharField(max_length=11, verbose_name="手机号码", unique=True, help_text="手机号码:用于接收验证码",
     validators=[validators.RegexValidator(regex=r"^1[3-8]\d{9}$", message="请输入正确格式的手机号码!")],
     error_messages={"unique": "您输入的手机号码已经存在!", "required": "手机号码不能为空!"})

    REQUIRED_FIELDS = [‘phone‘]

    # 这个类,是对User类的一个说明
    class Meta:
        db_table = "bbs_user"  # 如果不设置,就会是用django默认的数据表命名方式
        verbose_name = "用户表"
        verbose_name_plural = verbose_name

settings.py

AUTH_USER_MODEL = ‘user.User‘

三、补充

  按照以上步骤,在django3.0.0上是没有问题的,但是如果再django2.1.4就会出现错误

我们来比较一下两个地方

django3.0.0

class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, username, email, password, **extra_fields):
        """
        Create and save a user with the given username, email, and password.
        """
        if not username:
            raise ValueError(‘The given username must be set‘)
        email = self.normalize_email(email)
        username = self.model.normalize_username(username)
        user = self.model(username=username, email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, username, email=None, password=None, **extra_fields):
        extra_fields.setdefault(‘is_staff‘, False)
        extra_fields.setdefault(‘is_superuser‘, False)
        return self._create_user(username, email, password, **extra_fields)

    def create_superuser(self, username, email=None, password=None, **extra_fields):
        extra_fields.setdefault(‘is_staff‘, True)
        extra_fields.setdefault(‘is_superuser‘, True)

        if extra_fields.get(‘is_staff‘) is not True:
            raise ValueError(‘Superuser must have is_staff=True.‘)
        if extra_fields.get(‘is_superuser‘) is not True:
            raise ValueError(‘Superuser must have is_superuser=True.‘)

        return self._create_user(username, email, password, **extra_fields)

django2.1.4

class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, username, email, password, **extra_fields):
        """
        Create and save a user with the given username, email, and password.
        """
        if not username:
            raise ValueError(‘The given username must be set‘)
        email = self.normalize_email(email)
        username = self.model.normalize_username(username)
        user = self.model(username=username, email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, username, email=None, password=None, **extra_fields):
        extra_fields.setdefault(‘is_staff‘, False)
        extra_fields.setdefault(‘is_superuser‘, False)
        return self._create_user(username, email, password, **extra_fields)

    def create_superuser(self, username, email, password, **extra_fields):
        extra_fields.setdefault(‘is_staff‘, True)
        extra_fields.setdefault(‘is_superuser‘, True)

        if extra_fields.get(‘is_staff‘) is not True:
            raise ValueError(‘Superuser must have is_staff=True.‘)
        if extra_fields.get(‘is_superuser‘) is not True:
            raise ValueError(‘Superuser must have is_superuser=True.‘)

        return self._create_user(username, email, password, **extra_fields)

区别就在UserManager类下的create_superuser方法,django3.0.0使用了默认参数,而django2.1.4使用了位置参数,在重构时,我们用REQUIRED_FIELDS = [‘phone‘]将

REQUIRED_FIELDS = [‘email‘]覆盖了,因此在使用

>>> python manage.py createsuperuser

创建超级用户时,就不会提示输入邮箱信息,由于再django2.1.4中email为位置蚕食,没有值就会出错,所以为了在django2.1.4中正确重构,必须还要做一些修改

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

class UserManager(_UserManager):
    def create_superuser(self, username, password, email=None, **extra_fields):
        return super().create_superuser(username, email, password, **extra_fields)

# 在这里重构了django默认的用户表后,还要通知django,使用我重构后的表,需要在设置中声明
# AUTH_USER_MODEL = ‘user.User‘  应用名.类名

# 继承AbstractUser类
class User(AbstractUser):
    phone = models.CharField(max_length=11, verbose_name="手机号码", unique=True, help_text="手机号码:用于接收验证码",
     validators=[validators.RegexValidator(regex=r"^1[3-8]\d{9}$", message="请输入正确格式的手机号码!")],
     error_messages={"unique": "您输入的手机号码已经存在!", "required": "手机号码不能为空!"})

    objects = UserManager()

    REQUIRED_FIELDS = [‘phone‘]

    # 这个类,是对User类的一个说明
    class Meta:
        db_table = "bbs_user"  # 如果不设置,就会是用django默认的数据表命名方式
        verbose_name = "用户表"
        verbose_name_plural = verbose_name

原文地址:https://www.cnblogs.com/loveprogramme/p/12397685.html

时间: 2024-11-06 03:39:52

django之重构用户表的相关文章

Django解决扩展用户表时,后台Admin显示密码为明文的问题

小生博客:http://xsboke.blog.51cto.com 如果有疑问,请点击此处,然后发表评论交流,作者会及时回复(也可以直接在当前文章评论). -------谢谢您的参考,如有疑问,欢迎交流 Django解决当扩展用户表时,用户继承AbstractUser后,后台Admin会显示密码为明文的问题 先看项目列表 1.今天在写一个扩展Django默认的用户表功能时,遇到了一个问题.先给大家看一下我写的,扩展用户表的models[apps.users.models],我是通过继承Abstr

Django自定义用户表替换默认用户表认证

1.自定义用户表 from django.db import models from django.contrib.auth.models import AbstractUser # Create your models here. class UserProfile(AbstractUser):   ##引用Django内置的AbstractUser表,并添加下列字段     nick_name = models.CharField(max_length=50,default="",

Django基础之Form表单验证

Form表单验证 1.创建Form类(本质就是正则表达式的集合) from django.forms import Form from django.forms import fields from django.forms import widgets from Mybbs.models import * import re class UserForm(Form): username = fields.CharField( required=True, error_messages={'re

django中添加用户

在django中添加用户,直接在auth_user表中添加会有问题,因为这里密码是加密的,可以通过manage.py shell加入 创建User: 1 >>> from django.contrib.auth.models import User 2 >>> user = User.objects.create_user('esperyong', '[email protected]', '123456') 3 # 现在一个is_active属性为True的User对

Django:创建用户模型报错: (admin.E108) The value of 'list_display[4]'解决方案

参考资料:虫师-<web接口开发与自动化测试:基于python语言> 日常学习Django框架中,创建了用户模型,但是页面功能验证时候,提示不能进行列表字段操作,debug好久,才找到问题原因,心累... 下面是大概过程和解决方案... models.py文件代码: 1 from django.db import models 2 3 # Create your models here. 4 # 发布会表 5 class Event(models.Model): 6 name = models

# Django admin、form表单的应用记录

目录 Django admin.form表单的应用记录 一 Django admin 1. 使用介绍 form组件使用 1. form的作用 2. form组件生成HTMKL代码 3. form组件校验数据有效性 3. form组件如何给html标签设置默认值 Django admin.form表单的应用记录 一 Django admin 1. 使用介绍 1. 创建超级用户 python manage.py createsuperuser username: wph password: 1231

django继承修改 User表导致的问题

扩展默认的auth_user表参考: http://www.cnblogs.com/liwenzhou/p/9030211.html#undefined django继承修改 User表时,python  manage.py  makemigrations进行python  manage.py  migrate操作时会导致的问题如图: 根源:django文档中有注明: Due to limitations of Django’s dynamic dependency feature for sw

巨蟒django之CRM1 需求分析&amp;&amp;表结构设计&amp;&amp;注册登录验证

1.需求分析 1.项目 (1)业务 (2)权限的管理 2.CRM customer relationship management 客户关系管理系统 3.谁来使用CRM? 销售&&班主任&&讲师&&助教 4.项目的需求分析 (1)注册 (2)登录 (3)销售 1.客户信息管理 增加 编辑 展示 客户信息(删除一般不用它做,后台管理员来做,为了信息安全) 2.跟进信息管理 增加 编辑 展示 跟进信息 3.报名信息的管理 增加 编辑 展示 报名信息 4.缴费记录

Django实现单用户登录

最近由于要毕业了写论文做毕设,然后还在实习发现已经好久都没有写博客了.今天由于工作需求,需要用Django实现单用户登录.大概意思就是跟QQ一样的效果,每个账号只能一个地方登录使用,限制账号的登录次数.由于用的是Django自带的认证,然后校验用户是否登录其实就是通过Session实现的.下面就简单分享一下怎么实现的吧. 单用户登录实现 在做用户登录认证的时候Django自带的有is_authenticated()方法.下面就是一个简单的认证过程. if request.user.is_auth