2016-11-03 8 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) 

したがって、ユーザサインアップ、それは(col1col2)ならびに追加項目を要求したとき、離れusernameemail及びpasswordから。

以下はサインアップ画面です。

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'))) 
関連する問題