版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abc666666_6/article/details/84779289
需要自定义User模型的原因
-
需要前后台共同同一个账号。
-
字段需要自己定义,以及验证也需要自己设置
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager from django.db import models from shortuuidfield import ShortUUIDField class UserManager(BaseUserManager): def _create_user(self, telephone, password, username, **kwargs): if not telephone: raise ValueError("请输入手机号码") if not password: raise ValueError("请输入密码") if not username: raise ValueError("请输入用户名") user = self.model(telephone=telephone, username=username, **kwargs) user.set_password(password) user.save() # 记得调用save! return user def create_user(self, telephone, password, username, **kwargs): kwargs["is_superuser"] = False return self._create_user(telephone, password, username, **kwargs) def create_superuser(self, telephone, password, username, **kwargs): kwargs["is_superuser"] = True return self._create_user(telephone, password, username, **kwargs) class User(AbstractBaseUser, PermissionsMixin): # 使用shortuuid # 需要第三方包 shortuuidfield # pip install django-shortuuidfield uid = ShortUUIDField(primary_key=True) telephone = models.CharField(max_length=11, unique=True) username = models.CharField(max_length=100) email = models.EmailField(unique=True) is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) date_joined = models.DateTimeField(auto_now_add=True) USERNAME_FIELD = 'telephone' # 验证时username代表的字段是telephone REQUIRED_FIELDS = ['username'] # 创建超级用户的时候,需要键入值的字段,默认还包括USERNAME_FIELD定义的字段和password EMAIL_FIELD = 'email' objects = UserManager() # 注意写法 def get_full_name(self): return self.username def get_short_name(self): return self.username
-
登陆验证
from django.contrib.auth import login ,logout, authenticate from django.views.decorators.http import require_POST from .forms import LoginForm from django.http import JsonResponse from utils import restful # 用来返回json数据 """ json数据格式 { "code": 200, 这里的code不是http的状态码,是前后台约定的 "message": "", "data": {} } """ @require_POST def login_view(request): # 处理登陆逻辑 form = LoginForm(request.POST) if form.is_valid(): telephone = form.cleaned_data.get("telephone") password = form.cleaned_data.get("password") remember = form.cleaned_data.get("remember") user = authenticate(request, username=telephone, password=password) # 注意已经使用了自定义的User模型了 if user: if user.is_active: login(request, user) # 登陆 if remember: request.session.set_expiry(None) # 使用默认的session过期时间 else: request.session.set_expiry(0) # 浏览器关闭就过期 return restful.ok() # return JsonResponse({"code": 200, "message": "", "data": {}}) # 返回json数据 else: return restful.un_auth(message="your account is locked") # return JsonResponse({"code": 401, "message": "账号被冻结", "data":{}}) else: return restful.param_error(message="手机号或密码错误") # return JsonResponse({"code": 400, "message": "手机号或密码错误", "data": {}}) else: errors = form.get_errors() return restful.param_error(message=errors) # return JsonResponse({"code": 400, "message": errors, "data": {}})
-
要使用自定义User模型,需要在
setting.py
中设置AUTH_USER_MODEL = 'targetauth.User' # targetauth是python包名,User是自定义User模型的类名