在django中,如果使用CustomForm注册,如何使用Oauth登录

问题描述

我的 Django 应用有一个使用 CustomForm(从 UserCreationForm 继承)以及 Outh 登录/注册的选项。现在的问题是,如果用户已经使用 CustomForm 注册,如果下次他尝试使用 google Oauth 登录,那么 不是登录,而是 google Oauth 重定向到某些其他注册表单(不是我创建的)看起来像:

但由于用户已经注册,如果他在此处输入相同的用户名/电子邮件,则会显示用户名已被占用。 那么我该如何解决这个问题呢?我的意思是我希望用户能够使用 Oauth 登录,即使他使用 CustomForm 注册,我该如何实现? 或者即使我要求用户填写此表单能够使用 OAuth 登录,问题是他的电子邮件/用户名已经存在于数据库中,因此他将无法使用此表单进行注册

编辑:

如果这很难实现,那么当用户在使用 CustomForm 注册后尝试使用 oauth 登录时,我如何只显示一条消息, 类似 "You signed up using username rather than google account"而不是带他到社交帐户注册表单?

我在 views.py 中的注册函数

def register(request):
    if request.method == 'POST':
        
        form = CustomForm(request.POST or None)

        if form.is_valid():
            form.save()
            return redirect('login')

        else:
            return redirect('register')

    else:
        return render(request,'accounts/register.html')

forms.py 看起来像这样:

class CustomForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ("username","email")

解决方法

您可以使用 pre_social_login 信号

from allauth.exceptions import ImmediateHttpResponse
from allauth.socialaccount.signals import pre_social_login
from allauth.account.utils import perform_login
from allauth.utils import get_user_model

from django.dispatch import receiver
from django.shortcuts import redirect
from django.conf import settings

@receiver(pre_social_login)
def link_to_local_user(sender,request,sociallogin,**kwargs):
    email_address = sociallogin.account.extra_data['email']
    User = get_user_model()
    users = User.objects.filter(email=email_address)
    if users:
        perform_login(request,users[0],email_verification=settings.EMAIL_VERIFICATION)
        raise ImmediateHttpResponse(redirect(settings.LOGIN_REDIRECT_URL))

https://github.com/pennersr/django-allauth/issues/215