使用电子邮件作为身份验证字段的方法?

Way to use email as the authentication field?

我正在使用 Django 的内置身份验证系统。一切似乎都运行良好。注册时要求用户输入两个字段:usernameemail。登录时,他们需要输入 usernamepassword

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

在仍然使用 Django 的内置身份验证系统的情况下这可能吗?我在 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])

答案直接在 django documentation 中,简而言之,您应该子类化 AbstractBaseUserAbstractUser(在第二种情况下,您不能完全删除用户名字段),创建您自己的基于 BaseUserManagerUserManager 的用户管理器,如果您正在使用它(或者您正在使用的任何应用正在使用它),则可以自定义内置的身份验证表单。

这不是严格意义上的大炮,但为了避免创建新用户 class 或 Auth 后端,我倾向于让用户同时使用用户名或电子邮件登录。

无论如何,您需要确保电子邮件是唯一的,因为默认情况下 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')

这只是一个草稿,您可能应该包括一个表格来帮助验证/清理