【Django】重写auth_user表 𣲟

时间:2019-08-19
本文章向大家介绍【Django】重写auth_user表 𣲟,主要包括【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