我经历过这个问题之前。这是我使用的代码。
这是在API/backend.py
from django.contrib.auth.models import User
class EmailOrUsernameModelBackend(object):
def authenticate(self, username=None, password=None):
if '@' in username:
kwargs = {'email': username}
else:
kwargs = {'username': username}
try:
user = User.objects.get(**kwargs)
if user.check_password(password):
return user
except User.DoesNotExist:
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None
的认证后端,这是我settings.py
AUTHENTICATION_BACKENDS = (
'api.backend.EmailOrUsernameModelBackend',
'django.contrib.auth.backends.ModelBackend',
)
希望它能帮助。请告诉我,如果你仍然有麻烦。此代码将使您能够使用电子邮件来验证默认的Django用户,即使在Django管理员中也是如此。
尽管您的解决方案也很好,但它并不能完全解决我想要的问题,我会在几个小时内发布我的解决方案。顺便说一句,我从你的解决方案中得到了这个想法,所以这里给你一个+1。 –
如果用户名可以包含“@”,则在用户名中使用'if'@'来标识用户名是否为电子邮件是一种非常糟糕的方式来实现它。您至少应该使用模式匹配或在源处识别所选的选项。 – vintagexav
代替'如果用户名 '@':',用'django.core.validators.validate_email'这样的: '高清validateEmail(电子邮件): 尝试: validate_email(电子邮件) 返回true 除了ValidationError: 返回False' –