2016-11-03 5 views
3

소셜 로그인/가입에 django allauth를 사용하고 있습니다. 또한, 대체 로그인/가입으로 본인의 가입 양식을 가지고 있습니다. 다음은 대체 양식의 사용자로부터 가져 오는 필드입니다.Django all_auth 및 사용자 정의 양식

class Profile(models.Model): 
    col1 = models.CharField(max_length=50, blank=True, null=True) 
    col2 = models.CharField(max_length=50, blank=True, null=True) 
    user = models.OneToOneField(User) 

따라서, 사용자가 가입 한, 그것은 (col1, col2)뿐만 아니라 추가 필드를 요청하는 경우, 따로 username, emailpassword에서.

다음은 가입보기입니다.

user = User.objects.create_user(username, user_email, user_pass) 
Profile.objects.create(user=user, col1=col1, col2=col2) 
return 

따라서 사용자가 대체 양식을 통해 가입 할 때마다 위의보기가 호출됩니다.

이제 사용자가 소셜 계정 FB에서 가입 할 때 추가 정보 (예 : col1/col2)를 요청하지 않습니다. 그것은 추가 정보를 요구하지 않고 직접 가입하거나, 내가 묻고 싶지 않습니다.

그럼 신호를 사용하여 Profile 모델 등록 게시물에 행을 생성합니다. 다른 양식을 사용하여 사용자를 생성 할 때

@receiver(user_signed_up) 
def create_profile(request, user, sociallogin=None, **kwargs): 
    if sociallogin: 
     if sociallogin.account.provider == 'facebook': 
      data = sociallogin.account.extra_data 
      col1 = data.get('col1') 
      col2 = data.get('col2') 
      Profile.objects.create(user=user, col1=col1, col2=col2) 

그래서, (1) 내 문제가 어떤 기록은 allauth 테이블, 내가 이상한을 찾을 에 삽입되지 않습니다.

(2) 이메일 ID로 E1을 사용하는 대체 양식을 사용하여 가입하는 것으로 간주합니다. 이제 동일한 ID로 allauth(FB)을 통해 가입하면 오류가 발생합니다.

(3) all_auth을 사용하여 다른 양식으로 가입 한 사용자에게 확인 메일을 보내려면 어떻게해야합니까?

+0

왜 downvote ??? – PythonEnthusiast

+0

나는 downvoter가 아니다. 'extra_data'를 어떻게 저장하는지 설명 할 수 있습니까? –

+0

@RajaSimon - 데모 스 니펫'create_profile'이 질문에 제공됩니다. 친절하게보세요. 감사. :) – PythonEnthusiast

답변

2

나는 도서관에서 조금 놀았고 결국 내 질문에 대한 해결책을 발견했다. 다른 사람들이 검토 할 수 있도록 여기에 붙여 넣습니다.

조건을 확인할 신호 pre_social_login을 추가하십시오.

class MySocialAccountAdapter(DefaultSocialAccountAdapter): 

    def pre_social_login(self, request, sociallogin=None, **kwargs): 
     if sociallogin: 
      user = User.objects.filter(email=email).first() 
      # If user already exists in custom local form, then login directly. 
      # Save/Update his details in social login tables. 
      if user: 
       # create or update social login tables to maintain the uniformity in the code. 
       token = sociallogin.token.token 
       socialaccount = SocialAccount.objects.filter(user=user).first() 
       if socialaccount: # If it exists, then update social tables. 
        # updating account. 
        socialaccount.extra_data = extra_data 
        socialaccount.save() 
        # updating token. 
        SocialToken.objects.filter(account=socialaccount) \ 
             .update(token=token) 
       else: # else create. 
        # saving Social EmailAddress. 
        EmailAddress.objects.create(email=email, user=user) 

        # saving social account. 
        provider = 'facebook' 
        kwargs = { 
         'uid': extra_data.get('id'), 
         'provider': provider, 
         'extra_data': extra_data, 
         'user': user 
        } 
        socialaccount = SocialAccount.objects.create(**kwargs) 

        # saving social token. 
        app = SocialApp.objects.get(provider=provider) 
        kwargs = { 
         'token': token, 
         'account': socialaccount, 
         'app': app 
        } 
        SocialToken.objects.create(**kwargs) 

       # finally login. 
       user.backend = 'django.contrib.auth.backends.ModelBackend' 
       login(request, user) 
       raise ImmediateHttpResponse(redirect(reverse('index')))