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

时间:2015-02-19 11:51:49

标签: python django django-models django-authentication

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

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

这仍然可以在使用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])

2 个答案:

答案 0 :(得分:0)

答案直接在django documentation中,简而言之,您应该继承AbstractBaseUserAbstractUser(在第二种情况下,您无法完全删除用户名字段),创建自己的用户管理器基于BaseUserManagerUserManager并定制内置身份验证表单(如果您正在使用它)(或您正在使用的任何应用程序正在使用它)。

答案 1 :(得分:0)

这不是严格的大炮,但为了避免创建新的User类或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')

这只是一个草稿,你应该提供一个表格来帮助验证/清理