2016-11-03 2 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, email и 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) Рассмотрите, я зарегистрировался с использованием альтернативной формы с использованием E1 в качестве идентификатора электронной почты. Теперь я регистрируюсь через allauth(FB) с тем же идентификатором, что выдает ошибку.

(3) Как отправить письмо с подтверждением пользователям, которые зарегистрировались в альтернативной форме, используя all_auth.

+0

Почему downvote ??? – PythonEnthusiast

+0

Я не спутник. Можете ли вы объяснить, как вы сохраняете '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'))) 
Смежные вопросы