当前位置: 首页 > 知识库问答 >
问题:

django用户模型中的多用户名\字段

姬温文
2023-03-14

我的自定义用户模型:

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'

有没有办法指定多个用户名\u字段?类似于['email','username']这样用户就可以通过email和username登录了?

共有3个答案

潘辰龙
2023-03-14

不,您不能在USERNAME_FIELD中定义多个字段。

一种选择是编写自己的自定义登录,自己检查这两个字段。https://docs.djangoproject.com/en/1.8/topics/auth/customizing/

AUTHENTICATION_BACKENDS然后编写一个身份验证方法,检查数据库中两个字段的用户名。

PS您可能希望在您的模型上同时使用unique\u,这样您就不会遇到问题。

另一种选择是使用实际字段username存储字符串和电子邮件。

司徒高寒
2023-03-14

我们可以通过实现我们自己的电子邮件身份验证后端来做到这一点。

您可以执行以下操作:

步骤1:在设置中为自定义用户模型设置子站点:

因为我们不会使用Django的默认User模型进行身份验证,所以我们需要在settings.py中定义我们的自定义MyUser模型。指定MyUser作为项目设置中的AUTH_USER_MODEL

AUTH_USER_MODEL = 'myapp.MyUser'

步骤2:编写自定义身份验证后端的逻辑:

要编写我们自己的身份验证后端,我们至少需要实现两种方法,即获取用户(用户id)身份验证(**凭证)

from djanhtml" target="_blank">go.contrib.auth import get_user_model
from django.contrib.auth.models import check_password

class MyEmailBackend(object):
    """
    Custom Email Backend to perform authentication via email
    """
    def authenticate(self, username=None, password=None):
        my_user_model = get_user_model()
        try:
            user = my_user_model.objects.get(email=username)
            if user.check_password(password):
                return user # return user on valid credentials
        except my_user_model.DoesNotExist:
            return None # return None if custom user model does not exist 
        except:
            return None # return None in case of other exceptions

    def get_user(self, user_id):
        my_user_model = get_user_model()
        try:
            return my_user_model.objects.get(pk=user_id)
        except my_user_model.DoesNotExist:
            return None

步骤3:在设置中指定自定义身份验证后端:

写入自定义身份验证后端后,在authentication\u BACKENDS设置中指定此身份验证后端。

AUTHENTICATION\u BACKENDS包含要使用的身份验证后端的列表。Django尝试跨其所有身份验证后端进行身份验证。如果第一个身份验证方法失败,Django将尝试第二个身份验证方法,依此类推,直到尝试了所有后端。

AUTHENTICATION_BACKENDS = (
    'my_app.backends.MyEmailBackend', # our custom authentication backend
    'django.contrib.auth.backends.ModelBackend' # fallback to default authentication backend if first fails 
    )

如果通过MyEmailBackend进行身份验证失败,即用户无法通过email进行身份验证,那么我们将使用Django的默认身份验证modelbend,它将尝试通过MyUser模型的username字段进行身份验证。

斜瑞
2023-03-14

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

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)

然后,在设置中。py身份验证\u后端设置为您的身份验证后端:

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

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

 类似资料:
  • 我已经看到了创建Django用户模型实例的不同方法。它遵循了Django开发中的最佳实践 1. 2.

  • 问题内容: 用自定义字段扩展User模型(与Django的身份验证应用程序捆绑在一起)的最佳方法是什么?我也可能希望使用电子邮件作为用户名(用于身份验证)。 问题答案: 做到这一点确实是Django推荐的方法是通过属性。 扩展现有的用户模型 … 如果你希望存储与相关的信息,则可以对包含其他信息字段的模型使用一对一关系。这种一对一模型通常称为配置文件模型,因为它可能存储有关站点用户的与身份验证无关的

  • 1. 简介 用户模型是数据分析系统中围绕用户的分析方法论的集合。在“分析云”平台上,我们从“用户标识”和“用户属性”两个维度来进行用户分析。前者用于“精准标记用户是谁?”,后者用于 “自由拓展用户有什么特征”。 因此,通过结合用户模型和事件模型,即可完整分析“具备某些特征的用户都完成了哪些用户行为”这个典型的数据分析问题。 2. 用户标识体系 用户标识体系是统计分析系统最重要的基石。好的用户标识体

  • 问题内容: 我有一个领域模型: 在我的管理员中: 在这里,我不想在添加MyModel时在管理员中使用。我希望将其设置为当前用户,例如 我怎样才能做到这一点? 谢谢 问题答案: 您已经设置好了,因此它不会以Django管理员的形式出现。 现在,您需要覆盖,并在保存新对象之前设置用户。

  • 接下来的三章要实现网站的“注册”页面(构思图如图 6.1 所示),在此之前我们先要解决存储问题,因为现在还没地方存储用户信息。所以,实现用户注册功能的第一步是,创建一个数据结构,获取并存储用户的信息。 图 6.1:用户注册页面的构思图 在 Rails 中,数据模型的默认数据结构叫“模型”(model,MVC 中的 M,参见 1.3.3 节)。Rails 为解决数据持久化提供的默认解决方案是,使用数

  • 1. 简介 用户模型是数据分析系统中围绕用户的分析方法论的集合。在“分析云”平台上,我们从“用户标识”和“用户属性”两个维度来进行用户分析。前者用于“精准标记用户是谁?”,后者用于 “自由拓展用户有什么特征”。 因此,通过结合用户模型和事件模型,即可完整分析“具备某些特征的用户都完成了哪些用户行为”这个典型的数据分析问题。 2. 用户标识体系 用户标识体系是统计分析系统最重要的基石。好的用户标识体