【Django】重写auth_user表 𣲟
原文: http://blog.gqylpy.com/gqy/375
"```python
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()
数据迁移后,我们查看表结构如下:
sql
+--------------+--------------+------+-----+---------+----------------+
| 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://blog.gqylpy.com/gqy/375
原文地址:https://www.cnblogs.com/gqy02/p/11374960.html
- python unittest使用基本过程
- 基于unittest集成你的selenium2测试
- Selenium Webdriver Desired Capabilities
- 在Selenium Webdriver中使用XPath Contains、Sibling函数定位
- Python多线程Selenium跨浏览器测试
- Python Selenium设计模式-POM
- 基于Excel参数化你的Selenium2测试
- 创建你的第一个webdriver python代码
- Python Selenium Webdriver安装手册
- 工具篇 - HTTP协议报文结构及示例03
- 工具篇 - JMeter目录及关键配置分析02
- python unittest之加载及跳过测试方法和示例
- python unittest之异常测试
- python unittest之断言及示例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Selenium及python实现滚动操作多种方法
- PHP使用JPGRAPH制作圆柱图的方法详解
- PHP 实现超简单的SESSION与COOKIE登录验证功能示例
- PHP 图像处理与SESSION制作超简单验证码的方法示例
- 简述PHP7.4 新特性和废弃的功能
- laravel5.1框架下的批量赋值实现方法分析
- Laravel框架环境与配置操作实例分析
- 记Laravel调用Gin接口调用formData上传文件的实现方法
- Laravel框架视图和模型操作方法分析
- 接口测试框架实战(六) | 配置的数据驱动
- PHP连续签到功能实现方法详解
- PHP实现发送微博消息功能完整示例
- php实现快速对二维数组某一列进行组装的方法小结
- PHP实现提取多维数组指定一列的方法总结
- PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结