【Django】重写auth_user表 -- 2019-08-07 10:46:21
发布时间:2020-12-20 12:45:27 所属栏目:Python 来源:网络整理
导读:原创: http://106.13.73.98/__/151/ from django.db import modelsfrom django.contrib import authfrom django.core.exceptions import PermissionDeniedfrom django.utils.translation import ugettext_lazy as _from django.contrib.auth.models import A
原创: 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,password=None,**extra_fields): extra_fields.setdefault('is_staff',False) extra_fields.setdefault('is_superuser',False) return self._create_user(username,**extra_fields) def create_superuser(self,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,**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,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("生日",blank=True,help_text="日期格式:YYYY-MM-DD,相当于Python中的datetime.date()实例") email = models.EmailField("邮箱",max_length=255,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,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,obj) def has_perms(self,perm_list,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/ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |