django admin 操作重写用户模型 实例 带用户和权限组的
项目目录结构
续:自定义权限限制url访问权限:点我

models.py
from __future__ import unicode_literals from django.db import models from django.contrib.auth.models import ( PermissionsMixin , AbstractBaseUser,UserManager ) class MyUserManager(UserManager): #这里是重写了创建用户和超级用户的方法,因为自己的表中不需要用户写如emali # ,所以这里去掉了这个email参数,就不用写了 use_in_migrations = True def _create_user(self, username, 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') 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) class MyUser(PermissionsMixin,AbstractBaseUser): REQUIRED_FIELDS = ['phone'] USERNAME_FIELD = 'username' username = models.CharField('username',max_length=11,unique=True) password = models.CharField('password', max_length=512) #这个值要尽量大,因为保存到数据库中的密码是hash之后的数据,不是明文的 phone = models.CharField('phone',blank=True,max_length=11) is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) objects = MyUserManager() def get_full_name(self): # The user is identified by their username return self.username def get_short_name(self): # The user is identified by their username return self.username def __unicode__(self): return self.username # # def has_perm(self, perm, obj=None): # "Does the user have a specific permission?" # # Simplest possible answer: Yes, always # 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 return True # @property # def is_staff(self): # "Is the user a member of staff?" # # Simplest possible answer: All admins are staff # return self.is_staff
admin.py
from django import forms from django.contrib import admin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib.auth.forms import ReadOnlyPasswordHashField from accounts.models import MyUser admin.site.register(MyUser)
settings.py 一定要加这句话
AUTH_USER_MODEL = 'accounts.MyUser'
注意:这个一定要在项目刚创建的时候写好,然后在开始第一次的 python manage.py makemigrations python manage.py migrate
效果如下

models.py
from __future__ import unicode_literals from django.db import models from django.contrib.auth.models import ( PermissionsMixin , AbstractBaseUser,UserManager ) class MyUserManager(UserManager): #这里是重写了创建用户和超级用户的方法,因为自己的表中不需要用户写如emali # ,所以这里去掉了这个email参数,就不用写了 use_in_migrations = True def _create_user(self, username, 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') 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) class MyUser(PermissionsMixin,AbstractBaseUser): REQUIRED_FIELDS = ['phone'] USERNAME_FIELD = 'username' username = models.CharField('username',max_length=11,unique=True) password = models.CharField('password', max_length=512) #这个值要尽量大,因为保存到数据库中的密码是hash之后的数据,不是明文的 phone = models.CharField('phone',blank=True,max_length=11) is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) objects = MyUserManager() def get_full_name(self): # The user is identified by their username return self.username def get_short_name(self): # The user is identified by their username return self.username def __unicode__(self): return self.username # # def has_perm(self, perm, obj=None): # "Does the user have a specific permission?" # # Simplest possible answer: Yes, always # 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 return True # @property # def is_staff(self): # "Is the user a member of staff?" # # Simplest possible answer: All admins are staff # return self.is_staff
views.py 用户登陆和用户注册
from django.shortcuts import render,redirect,HttpResponse from django.contrib import auth # Create your views here. from accounts.models import MyUser def log_in(request): if request.method=="POST": username=request.POST['user'] password=request.POST['pwd'] print(username,password,'zheshi dengl xixni========') user = auth.authenticate(username=username,password=password) if user: #设置session内部的字典内容 auth.login(request,user) #登录成功就将url重定向到后台的url return HttpResponse('登陆成功') else: return redirect('/accounts/login/') #登录不成功或第一访问就停留在登录页面 return render(request,'login.html') def sign_up(request): state = None if request.method == 'POST': password = request.POST.get('pwd1', '') repeat_password = request.POST.get('pwd2', '') phone = request.POST.get('phone', '') username = request.POST.get('user', '') if MyUser.objects.filter(username=username): state = 'user_exist' else: if password == repeat_password: new_user = MyUser.objects.create_user(username=username, password=password, phone=phone) new_user.save() return HttpResponse('成功') # return redirect('/book/') state = '密码两次不一致' content = { 'state': state, 'user': None,} return render(request, 'sign_up.html', content)
urls.py
from django.urls import path from accounts import views urlpatterns = [ path('login/', views.log_in), path('signup/', views.sign_up), ]
login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/accounts/login/" method="post"> <p>用户名: <input type="text" name="user"></p> <p>密码: <input type="password" name="pwd"></p> <p><input type="submit"></p> </form> </body> </html>
sign_up.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/accounts/signup/" method="post"> <p>用户名: <input type="text" name="user"></p> <p>密码: <input type="password" name="pwd1"></p> <p>确认密码: <input type="password" name="pwd2"></p> <p>手机号: <input type="text" name="phone"></p> <p><input type="submit"></p> </form> </body> </html>
项目文件:点我
浙公网安备 33010602011771号