首页 > 解决方案 > 我们可以通过用户名以及来自 django 中用户名字段的电子邮件对用户进行身份验证吗?

问题描述

我正在使用 Django 内置身份验证。用户可以通过 django 登录表单中的用户名和密码登录。但我希望用户也能够使用电子邮件 ID 和密码登录。

登录表单只有 用户名字段。我们可以使用此登录字段输入电子邮件 ID 或用户名并验证用户身份吗?

这是我的 django 登录视图

class LoginForm(generic.CreateView):
print("login")
form_class = LoginForm
template_name = "feed/SignUp.html"

def get(self, request):
    form = self.form_class(None)
    return render(request, self.template_name, {'form': form})

def post(self, request):
    form = self.form_class(request.POST)
    if form.is_valid():
        UserModel = get_user_model()
        username = request.POST['username']
        password = request.POST['password']

        user = authenticate(request, username=username, password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                return redirect('')
    else:
        print(form.errors)

我的想法就像我们可以通过用户名或电子邮件登录 GitHub 帐户一样。我应该怎么做才能实现这一目标?

标签: djangopython-3.xdjango-formsdjango-views

解决方案


您可以检查用户名输入是否是一封电子邮件:

from django.core.validators import validate_email

try:
    validate_email(username_field) # If it's a valid email
    username = User.objects.get(email=username_field).username # Get username with email
    authenticate(username=username, password=password_field) # Authenticate that user
except:
    # It's a username, so do the normal authentication

推荐阅读