2016-11-03 66 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),除了usernameemailpassword

以下是註冊視圖。

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)考慮一下,我使用E1作爲電子郵件ID使用替代形式註冊。現在我通過allauth(FB)註冊相同的ID,它會引發錯誤。 (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')))