Ошибка "CustomUser не имеет клиента" для пользователей, авторизованных через google
У меня есть модель CustomUser для разграничения между клиентом и торговцем.
class CustomUser(AbstractUser):
is_customer = models.BooleanField(default=False)
is_merchant = models.BooleanField(default=False)
is_superuser = models.BooleanField(default=False)
first_name = models.CharField(max_length=255)
last_name = models.CharField(max_length=255)
Теперь у клиентов есть функция добавления в корзину, для которой у меня есть utils.py
def cartData(request):
if request.user.is_authenticated:
customer = request.user.customer
order, created = Order.objects.get_or_create(customer=customer, complete=False)
items = order.orderitem_set.all()
cartItems = order.get_cart_items
else:
cookieData = cookieCart(request)
cartItems = cookieData['cartItems']
order = cookieData['order']
items = cookieData['items']
return {'cartItems':cartItems ,'order':order, 'items':items}
В соответствии с utils.py мне всегда нужен request.user.customer. Экземпляр customer здесь создается во время регистрации клиента.
forms.py:
@transaction.atomic
def save(self):
user = super().save(commit=False)
user.is_customer = True
user.first_name = self.cleaned_data.get('first_name')
user.last_name = self.cleaned_data.get('last_name')
user.username=self.cleaned_data.get('username')
user.email=self.cleaned_data.get('email')
user.phone_number=self.cleaned_data.get('phone_number')
user.address=self.cleaned_data.get('address')
user.save()
customer = Customer.objects.create(user=user)
customer.first_name=self.cleaned_data.get('first_name')
customer.last_name=self.cleaned_data.get('last_name')
customer.username=self.cleaned_data.get('username')
customer.email=self.cleaned_data.get('email')
customer.phone_number=self.cleaned_data.get('phone_number')
customer.address=self.cleaned_data.get('address')
customer.save()
return user
Итак, с клиентом все работало просто отлично. Но проблема возникает, когда я пытаюсь войти в систему с помощью google. Я зарегистрировался в функциональности google с помощью Oauth, поработал в консоли разработчиков google, установил необходимые пакеты и внес изменения в settings.py.
settings.py:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sites',
'projectapp.apps.ProjectappConfig',
'django_extensions',
'allauth',
'allauth.account',
'allauth.socialaccount',
'allauth.socialaccount.providers.google',
'allauth.socialaccount.providers.facebook',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'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',
'whitenoise.middleware.WhiteNoiseMiddleware',
]
AUTHENTICATION_BACKENDS = [
# Needed to login by username in Django admin, regardless of `allauth`
'django.contrib.auth.backends.ModelBackend',
# `allauth` specific authentication methods, such as login by e-mail
'allauth.account.auth_backends.AuthenticationBackend',
]
SOCIALACCOUNT_PROVIDERS = {
'google': {
'SCOPE': [
'profile',
'email',
],
'AUTH_PARAMS': {
'access_type': 'online',
}
}
}
Ошибка заключается в том, что когда я нажал на кнопку "войти с помощью google", я столкнулся с ошибкой
CustomUser has no customer.
В панели администратора пользователь создан, но для него нет клиента.
Очевидно, из ошибки я понял, что для пользователей, которые вошли в систему с помощью google, нужен экземпляр клиента. Но я не понимаю, как я могу их создать, так как у меня нет специальной формы для этого типа пользователей.