我經歷過這個問題之前。這是我使用的代碼。
這是在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' –