使用电子邮件作为身份验证字段的方法?
Way to use email as the authentication field?
我正在使用 Django 的内置身份验证系统。一切似乎都运行良好。注册时要求用户输入两个字段:username
和 email
。登录时,他们需要输入 username
和 password
。
我想更改此行为,以便用户名字段消失。我想将电子邮件视为用户的用户名。因此,在登录时,用户将需要输入 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 中,简而言之,您应该子类化 AbstractBaseUser
或 AbstractUser
(在第二种情况下,您不能完全删除用户名字段),创建您自己的基于 BaseUserManager
或 UserManager
的用户管理器,如果您正在使用它(或者您正在使用的任何应用正在使用它),则可以自定义内置的身份验证表单。
这不是严格意义上的大炮,但为了避免创建新用户 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')
这只是一个草稿,您可能应该包括一个表格来帮助验证/清理
我正在使用 Django 的内置身份验证系统。一切似乎都运行良好。注册时要求用户输入两个字段:username
和 email
。登录时,他们需要输入 username
和 password
。
我想更改此行为,以便用户名字段消失。我想将电子邮件视为用户的用户名。因此,在登录时,用户将需要输入 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 中,简而言之,您应该子类化 AbstractBaseUser
或 AbstractUser
(在第二种情况下,您不能完全删除用户名字段),创建您自己的基于 BaseUserManager
或 UserManager
的用户管理器,如果您正在使用它(或者您正在使用的任何应用正在使用它),则可以自定义内置的身份验证表单。
这不是严格意义上的大炮,但为了避免创建新用户 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')
这只是一个草稿,您可能应该包括一个表格来帮助验证/清理