Django用户模型中的多个USERNAME_FIELD [英] Multiple USERNAME_FIELD in django user model

查看:390
本文介绍了Django用户模型中的多个USERNAME_FIELD的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的自定义用户模型:

class MyUser(AbstractBaseUser):
    username = models.CharField(unique=True,max_length=30)
    email = models.EmailField(unique=True,max_length=75)
    is_staff = models.IntegerField(default=False)
    is_active = models.IntegerField(default=False)
    date_joined = models.DateTimeField(default=None)

    # Use default usermanager
    objects = UserManager()

    USERNAME_FIELD = 'email'

是否可以指定多个 USERNAME_FIELD ?类似于 ['email','username'] 这样的用户可以通过电子邮件以及用户名登录吗?

Is there a way to specify multiple USERNAME_FIELD ? Something like ['email','username'] so that users can login via email as well as username ?

推荐答案

USERNAME_FIELD 设置不支持列表。您可以创建一个自定义身份验证后端,以尝试在电子邮件或用户名字段上查找用户。

The USERNAME_FIELD setting does not support a list. You could create a custom authentication backend that tries to look up the user on the 'email' or 'username' fields.

from django.db.models import Q

from django.contrib.auth import get_user_model

MyUser = get_user_model()

class UsernameOrEmailBackend(object):
    def authenticate(self, username=None, password=None, **kwargs):
        try:
           # Try to fetch the user by searching the username or email field
            user = MyUser.objects.get(Q(username=username)|Q(email=username))
            if user.check_password(password):
                return user
        except MyUser.DoesNotExist:
            # Run the default password hasher once to reduce the timing
            # difference between an existing and a non-existing user (#20760).
            MyUser().set_password(password)

然后在 settings.py 设置 AUTHENTICATION_BACKENDS 到您的身份验证后端:

Then, in your settings.py set AUTHENTICATION_BACKENDS to your authentication backend:

 AUTHENTICATION_BACKENDS = ('path.to.UsernameOrEmailBackend,)\

请注意,解决方案并不完美。例如,密码重设仅适用于您在 USERNAME_FIELD 设置中指定的字段。

Note that this solution isn't perfect. For example, password resets would only work with the field specified in your USERNAME_FIELD setting.

这篇关于Django用户模型中的多个USERNAME_FIELD的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆