Django用邮箱和手机号登录

1、由于原来的User Model没有手机号字段。因此要扩展User model。

只要继承AbstractUser类即可。

from django.db import models
from django.contrib.auth.models import AbstractUser


class UserProfile(AbstractUser):
    nick_name = models.CharField(max_length=50, verbose_name="昵称", default="")
    birthday = models.DateField(verbose_name="生日", blank=True, null=True)
    mobile = models.CharField(max_length=11, verbose_name="手机", default="")
    address = models.CharField(max_length=50, verbose_name="地址", default="")
    image = models.ImageField(verbose_name="用户头像", upload_to="users/%Y/%m", default="")

    class Meta:
        verbose_name = "用户信息"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.username
2、继承ModelBackend修改登录用户判断
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q

from .models import UserProfile


class CustomBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        try:
            user = UserProfile.objects.get(Q(username=username) | Q(email=username) | Q(mobile=username))
            if user.check_password(password):
                return user
        except Exception as e:
            return None

3、修改settings.py,添加

AUTHENTICATION_BACKENDS,指向我们写的CustomBackend
AUTHENTICATION_BACKENDS = [
    'users.views.CustomBackend',
]

 

你可能感兴趣的:(Django,Django)