【Django】重写auth_user表 -- 2019-08-08 18:03:33

原文: http://106.13.73.98/__/151/

from django.db import models
from django.contrib import auth
from django.core.exceptions import PermissionDenied
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager

class UserManager(BaseUserManager):
    use_in_migrations = True

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

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

    def create_superuser(self, username, 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, password, **extra_fields)

# A few helper functions for common logic between User and AnonymousUser.
def _user_get_all_permissions(user, obj):
    permissions = set()
    for backend in auth.get_backends():
        if hasattr(backend, "get_all_permissions"):
            permissions.update(backend.get_all_permissions(user, obj))
    return permissions

def _user_has_perm(user, perm, obj):
    """
    A backend can raise `PermissionDenied` to short-circuit permission checking.
    """
    for backend in auth.get_backends():
        if not hasattr(backend, 'has_perm'):
            continue
        try:
            if backend.has_perm(user, perm, obj):
                return True
        except PermissionDenied:
            return False
    return False

def _user_has_module_perms(user, app_label):
    """
    A backend can raise `PermissionDenied` to short-circuit permission checking.
    """
    for backend in auth.get_backends():
        if not hasattr(backend, 'has_module_perms'):
            continue
        try:
            if backend.has_module_perms(user, app_label):
                return True
        except PermissionDenied:
            return False
    return False

# ========================================================================================================================
# =====================================其它代码可以不管,更改下面的字段等信息就可以了==============================================
# ========================================================================================================================

class UserProfile(AbstractBaseUser, PermissionsMixin):
    username = models.CharField("用户名", max_length=32, unique=True)
    is_staff = models.BooleanField(_('staff status'), default=False, help_text=_("是否可以登录到管理站点"))
    is_active = models.BooleanField(default=True, help_text=("是否激活"))
    nickname = models.CharField("昵称", max_length=32)
    avatar = models.ImageField("头像", upload_to="UA", default='UA/default.jpg')
    gender = models.CharField("性别", choices=(("male", "男"), ("female", "女")), max_length=8, null=True, blank=True)
    birthday = models.DateField("生日", null=True, blank=True, help_text="日期格式:YYYY-MM-DD,相当于Python中的datetime.date()实例")
    email = models.EmailField("邮箱", max_length=255, null=True, blank=True)  # EmailField:字符串类型,Django Admin以及ModelForm中提供验证机制
    date_joined = models.DateTimeField("加入日期", auto_now_add=True)

    USERNAME_FIELD = 'username'  # 你必须指定用户名
    # REQUIRED_FIELDS = []  # 还可以指定必填字段

    class Meta:
        db_table = 'user'  # 指定数据库中的表名称
        verbose_name_plural = '用户信息'  # 管理站点中显示的表名称

# 迁移数据后,你会发现数据库表字段中的前3个字段为:password、last_login、is_superuser
# 不必惊慌,这是Django做的,认证系统中会用到这3个字段

# 最后,在settings.py文件中指定此类:
    # AUTH_USER_MODEL = 'App名称.UserProfile'

# ========================================================================================================================
# ========================================================================================================================

    def __str__(self):  # __unicode__ on Python 2
        return self.username  # 该返回值会作为认证方法authenticate()的返回值

    def get_full_name(self):
        # The user is identified by their email address
        return self.nickname

    def get_short_name(self):
        # The user is identified by their email address
        return self.username

    def has_perm(self, perm, obj=None):
        #     "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always

        if self.is_active and self.is_superuser:
            return True
        return _user_has_perm(self, perm, obj)

    def has_perms(self, perm_list, obj=None):
        #     "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        for perm in perm_list:
            if not self.has_perm(perm, obj):
                return False
        return True

    def has_module_perms(self, app_label):
        #     "Does the user have permissions to view the app `app_label`?"
        #     Simplest possible answer: Yes, always
        if self.is_active and self.is_superuser:
            return True

        return _user_has_module_perms(self, app_label)

    objects = UserManager()

数据迁移后,我们查看表结构如下:

+--------------+--------------+------+-----+---------+----------------+
| Field        | Type         | Null | Key | Default | Extra          |
+--------------+--------------+------+-----+---------+----------------+
| id           | int(11)      | NO   | PRI | NULL    | auto_increment |
| password     | varchar(128) | NO   |     | NULL    |                |   # (密码)
| last_login   | datetime(6)  | YES  |     | NULL    |                |   # (最后一次登录时间)
| is_superuser | tinyint(1)   | NO   |     | NULL    |                |   # (是否为超级用户)
| username     | varchar(32)  | NO   | UNI | NULL    |                |
| is_staff     | tinyint(1)   | NO   |     | NULL    |                |
| is_active    | tinyint(1)   | NO   |     | NULL    |                |
| nickname     | varchar(32)  | NO   |     | NULL    |                |
| avatar       | varchar(100) | NO   |     | NULL    |                |
| gender       | varchar(8)   | YES  |     | NULL    |                |
| birthday     | date         | YES  |     | NULL    |                |
| email        | varchar(255) | YES  |     | NULL    |                |
| date_joined  | datetime(6)  | NO   |     | NULL    |                |
+--------------+--------------+------+-----+---------+----------------+

原文: http://106.13.73.98/__/151/

原文地址:https://www.cnblogs.com/gqy02/p/11322828.html

时间: 2024-11-06 11:33:20

【Django】重写auth_user表 -- 2019-08-08 18:03:33的相关文章

django 重写User表增加字段设置

models中: from django.contrib.auth.models import AbstractUser lass User(AbstractUser): mobile = models.CharField(max_length=11,unique=True,verbose_name='手机号') 并且在setting中进行 设置: AUTH_USER_MODEL = 'users.User' #应用表 + 表名 这样就可以给django认证的user表 增加字段 原文地址:ht

UnitSelector.ONDA.18.03.08 1CD+AutoDesSys form.Z pro v8.6.3.1 32&64

Survey CAD System pfCAD agriCAD v4.0.40 农业绘图和设计软件Agricad PC提供农业绘图和设计工作的工具. 它是在CAD环境中开发的,主要功能是: 映射管理边界的验证和控制使用Supertrack进行工作的可视化和打印葡萄园和果园的设计枢轴灌溉设计泥浆扩散作业的管理 SynaptiCAD Product Suite 20.31 电子电路设计自动化软件使用SynaptiCAD工具,您可以开始分析和模拟设计思路,而无需完成整个电路或模型模型. Synapti

django的RBAC认证z;自定义auth_user表;认证组件权限组件源码分析;认证组件;权限组件

一 RBAC 1.RBAC:全称(Role-Based Access Control):指的是基于用户权限访问控制的认证. 2.Django框架采用的是RBAC认证规则,RBAC认证规则通常会分为:三表规则,五表规则:Django采用的是六表规则. # 三表:用户表.角色表.权限表# 五表:用户表.角色表.权限表.用户角色关系表.角色权限关系表# 六表:用户表.角色表.权限表.用户角色关系表.角色权限关系表.用户权限关系表 3.在Django中六表之间是都是多对多的关系,可通过下面字段跨表访问

Django创建数据表

Django中创建表, 用的django项目自带的sqlite数据库,创建完成后将表注册到jdango.admin,就可以在浏览器在管理了. 在django项目的models.py文件中: from django.db import models # Create your models here. class Author(models.Model): name = models.CharField(max_length=100) age = models.IntegerField(defau

2014/08/08 – Backbonejs

[来自: Backbone.js 开发秘笈 第5章] Event API: (function ($) { //define ------------------------- var obj = {}; var obj2 = { commonEvent: function () { window.document.title = new Date().toString(); } }; //扩展对象包含事件 _.extend(obj, Backbone.Events); _.extend(obj

Django之Form表单

Django From简介 我们之前在HTML页面中利用form表单向后端提交数据时,都会写一些获取用户输入的标签并且用form标签把它们包起来. 与此同时我们在好多场景下都需要对用户的输入做校验,比如校验用户是否输入,输入的长度和格式等正不正确.如果用户输入的内容有错误就需要在页面上相应的位置显示显示对应的错误信息.. Django form组件就实现了上面所述的功能. 总结一下,其实form组件的主要功能如下: 生成页面可用的HTML标签 对用户提交的数据进行校验 保留上次输入内容 Djan

django的多表操作

django的多表操作 1.使用场景 在实际生产过程多,我们面对的数据纷繁复杂,此时就需要良好的数据结构设计,多表之间的约束关系为我们提供了数据管理以及查询的便利.在MYsql中我们利用外键(foreign key)来实现这样的约束关系,在django中我们通过调用相应的API来实现这样的功能. 2.创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄.作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关系(

【Python全栈-后端开发】Django进阶2-Form表单

Django进阶2-Form表单 Django的Form主要具有一下几大功能: 生成HTML标签(可以保留上次输入内容) 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 一.小试牛刀 1.创建Form类 在app01 文件夹下-->创建新的.py 文件 from django.forms import Form from django.forms import widgets from django.forms import fields class M

Django 重写用户模型

目录 Django 重写用户模型 修改配置文件,覆盖默认的User模型 引用User模型 指定自定义的用户模型 Django 期望你自定义的 User model 满足一些最低要求: 下面为一些AbstractBaseUser的子类必须定义的关键的字段和方法: 下面为一些AbstractBaseUser的子类可以使用的方法: 为你的User模型自定义一个管理器 扩展Django默认的User 自定义用户与内置身份验证表单 自定义用户和django.contrib.admin 自定义用户和权限 如