Django allauth — как отправить пользователей, которые только что зарегистрировались в Google, на промежуточный экран, где они заполняют дополнительную информацию

#django #django-allauth

#джанго #джанго-аллаут

Вопрос:

Я интегрировал django-allauth в свое приложение Django, но я хотел бы внести небольшие изменения в текущий процесс регистрации.

Проблема В настоящее время, если пользователь использует регистрацию Google для регистрации в моем приложении, django-allauth создает для него учетную запись, извлекая определенный объем информации из Google, а затем отправляет пользователя на домашнюю страницу.

Желаемое поведение Я хотел бы,чтобы пользователи, которые только что завершили процесс аутентификации через google/allauth, были отправлены на промежуточный экран (который они могут пропустить, если действительно захотят), где им запрашивается дополнительная информация (например, номер телефона), чтобы я мог заполнить их профиль.

Установка

У меня есть пользовательская модель пользователя, в которой электронная почта является основным уникальным идентификатором пользователя.

 from django.contrib.auth.base_user import BaseUserManager from django.db import models from django.contrib.auth.models import AbstractUser from django.utils.translation import ugettext_lazy as _   class CustomUserManager(BaseUserManager):  """  Custom user model manager where email is the unique identifiers  for authentication instead of usernames.  """  def create_user(self, email, password, **extra_fields):  """  Create and save a User with the given email and password.  """  if not email:  raise ValueError(_('The Email must be set'))  email = self.normalize_email(email)  user = self.model(email=email, **extra_fields)  user.set_password(password)  user.save()  return user   def create_superuser(self, email, password, **extra_fields):  """  Create and save a SuperUser with the given email and password.  """  extra_fields.setdefault('is_staff', True)  extra_fields.setdefault('is_superuser', True)  extra_fields.setdefault('is_active', True)   if extra_fields.get('is_staff') is not True:  raise ValueError(_('Superuser must have is_staff=True.'))  if extra_fields.get('is_superuser') is not True:  raise ValueError(_('Superuser must have is_superuser=True.'))  return self.create_user(email, password, **extra_fields)   class CustomUser(AbstractUser):  username = None  email = models.EmailField(_('email address'), unique=True)  #phone = models.IntegerField() to be properly added, not sure how yet   USERNAME_FIELD = 'email'  REQUIRED_FIELDS = []   objects = CustomUserManager()   def __str__(self):  return self.email  

Мой Settings.py

 ...  # Application definition  INSTALLED_APPS = [  'django.contrib.admin',  'django.contrib.auth',  'django.contrib.sites',  'django.contrib.contenttypes',  'django.contrib.sessions',  'django.contrib.messages',  'django.contrib.staticfiles',   'allauth',  'allauth.account',  'allauth.socialaccount',  'allauth.socialaccount.providers.google',  'whitenoise.runserver_nostatic', # new ]  MIDDLEWARE = [  #'django.middleware.security.SecurityMiddleware',  'whitenoise.middleware.WhiteNoiseMiddleware',  'django.contrib.sessions.middleware.SessionMiddleware',  'django.middleware.common.CommonMiddleware',  'django.middleware.csrf.CsrfViewMiddleware',  'django.contrib.auth.middleware.AuthenticationMiddleware',  'django.contrib.messages.middleware.MessageMiddleware',  'django.middleware.clickjacking.XFrameOptionsMiddleware', ]   ...   AUTH_PASSWORD_VALIDATORS = [  {  'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',  },  {  'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',  },  {  'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',  },  {  'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',  }, ]    AUTHENTICATION_BACKENDS = [  'django.contrib.auth.backends.ModelBackend',  'allauth.account.auth_backends.AuthenticationBackend',  'guardian.backends.ObjectPermissionBackend', ]  SITE_ID = 3 LOGIN_REDIRECT_URL = '/' ACCOUNT_ADAPTER = 'myusermodel.adapter.MyAccountAdapter'    # Additional configuration settings SOCIALACCOUNT_QUERY_EMAIL = True ACCOUNT_LOGOUT_ON_GET = True ACCOUNT_UNIQUE_EMAIL = True ACCOUNT_EMAIL_REQUIRED = True ACCOUNT_USER_MODEL_USERNAME_FIELD = None ACCOUNT_USERNAME_REQUIRED = False ACCOUNT_AUTHENTICATION_METHOD = 'email' AUTH_USER_MODEL = 'myusermodel.CustomUser'    SOCIALACCOUNT_PROVIDERS = {  'google': {  'SCOPE': [  'profile',  'email',  ],  'AUTH_PARAMS': {  'access_type': 'online',  }  } }  ...   

Ответ №1:

Я все понял. В принципе, мне пришлось создать этот микс, который я поместил в свои представления на основе классов.

Эта dispatch функция позволяет выполнять все if проверки, которые я хочу, и отправлять пользователей на промежуточный экран, если их профиль не заполнен или что-то в этом роде.

 from django.shortcuts import redirect from django.urls import reverse from django.contrib.auth.mixins import LoginRequiredMixin   class MyLoginRequiredMixin(LoginRequiredMixin):  def get_login_url(self):  return reverse('action:login')   def dispatch(self, request, *args, **kwargs):  if not request.user.is_authenticated:  return self.handle_no_permission()  if not request.user.first_name:  return redirect('www.google.com')   return super().dispatch(request, *args, **kwargs)