Python 如何使用电子邮件作为身份验证字段?

Python 如何使用电子邮件作为身份验证字段?,python,django,django-models,django-authentication,Python,Django,Django Models,Django Authentication,我正在使用django的内置身份验证系统。一切似乎都很顺利。用户在注册时需要输入两个字段:用户名和电子邮件。登录时,他们需要输入用户名和密码 我想更改此行为,以便用户名字段消失。我想将电子邮件视为用户用户名。因此,在登录时,用户需要输入电子邮件/密码 在仍然使用django内置的auth系统时,这可能吗?我在django 1.7上 更新 我需要添加其他字段,因此我在models.py中添加了以下内容 从django.db导入模型 从django.contrib.auth.models导入用户 c

我正在使用django的内置身份验证系统。一切似乎都很顺利。用户在注册时需要输入两个字段:用户名和电子邮件。登录时,他们需要输入用户名和密码

我想更改此行为,以便用户名字段消失。我想将电子邮件视为用户用户名。因此,在登录时,用户需要输入电子邮件/密码

在仍然使用django内置的auth系统时,这可能吗?我在django 1.7上

更新

我需要添加其他字段,因此我在models.py中添加了以下内容

从django.db导入模型 从django.contrib.auth.models导入用户

class UserProfile(models.Model):
    user = models.OneToOneField(User)
    telephone_number = models.CharField(max_length=100)
    website_url = models.CharField(max_length=100)

User.profile = property(lambda u: UserProfile.objects.get_or_create(user=u)[0])

答案是直接的,简而言之,您应该为AbstractBaseUser或AbstractUser子类。在第二种情况下,您不能完全删除用户名字段,基于BaseUserManager或UserManager创建您自己的用户管理器,并自定义内置身份验证表单(如果您正在使用它或您正在使用的任何应用程序正在使用它)。

这不是严格意义上的cannon,但为了避免创建新的用户类或身份验证后端,我倾向于让用户使用用户名或电子邮件登录

不管怎样,您都希望确保电子邮件是唯一的,因为django在默认情况下不会对此进行检查

然后,您必须覆盖默认登录视图以支持此操作。您可以创建以下内容:

class EmailUsernameLoginView(View):

    def post(self, request):
        next = request.POST.get('next', None)
        username = request.POST.get('username', None)
        password = request.POST.get('password', None)
        error = ''
        if username and password:
            try:
                usr = User.objects.get(email=username)
                username = usr.username
            except User.DoesNotExist:
                pass  # If the user doesn't exist, it's an username
            user = authenticate(username=username, password=password)
            if user is not None:
                if user.is_active:
                    login(request, user)
                    return redirect(next)
                else:
                    error = 'Your account is not active'
            else:
                error = 'The username / email - password comb is wrong'
        else:
            error = 'Please provide a username / email and password' 
        ctx = {'error': error}  # Fill with needed feedback
        return render(request, ctx, 'registration/login.html')

这只是一个草稿,您可能应该包括一个帮助验证/清理的表单。@DanielRoseman我查阅了文档,但我已经制作了一个额外的模型,因为我需要添加额外的字段。请参阅问题的更新部分我浏览了文档,但我已经制作了一个额外的模型,因为我需要添加额外的字段。请参阅本手册的更新部分question@birdy您创建了一个UserProfile模型。您需要创建一个新的用户模型和一个新的UserManager,以使该字段完全消失。此外,您还必须实现注册和登录的自定义视图创建额外模型和覆盖默认用户模型不是一回事。您可以同时执行这两项操作,但必须在您的配置文件模型中将外键固定到用户模型。@GwynBleidD我使用的是带有角度前端的应用程序。所以一切都结束了RESTAPI的我会改变前端…这不是问题。如果我是AbstractBaseUser的子类,我还需要我创建的UserProfile模型吗?或者,当我将AbstractBaseUser子类化时,我也可以在其中添加我的自定义字段……您可以将数据从UserProfile移动到新类中,或者让它保持这种方式,这完全取决于您。如果它是一个实时应用程序,请记住将适当的迁移放在依赖于用户模型的所有应用程序中,对于将包含新用户模型的应用程序,也要将所有数据移动到新类中。但如果任何第三方应用程序依赖于用户类,则仍然无法迁移。但这仍然要求用户在注册时输入用户名和电子邮件。当然。您必须以其他方式覆盖很多内容。您还可以在保存用户时随机创建一些用户名或根据电子邮件字段创建一些用户名。