Django项目(2)-自定义User模型

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abc666666_6/article/details/84779289

需要自定义User模型的原因

  1. 需要前后台共同同一个账号。

  2. 字段需要自己定义,以及验证也需要自己设置

    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模型的类名
    

猜你喜欢

转载自blog.csdn.net/abc666666_6/article/details/84779289