Итак, у меня есть проект, в котором используется пользовательская модель пользователя. Модель пользователя по умолчанию расширена для использования модели профиля с отношением OneToOne к модели пользователя.
Я бы хотел использовать django allauth для проверки адресов электронной почты и добавления входа в социальную сеть.
У меня есть некоторые проблемы с пользовательской регистрацией, я прочитал следующее Как настроить профиль пользователя при использовании django-allauth , но не совсем понятно, как это реализовать, я получаю ошибку;
Объект 'GuestSignUpForm' не имеет атрибута 'save'
Я искал на форуме, и, кажется, нет "официальной" документации о том, как это сделать, некоторые люди используют ModelForms, другие наследуют от SignUpView, некоторые регистрируют def, а другие используют def save ...
Я попытался настроить UserModel по умолчанию с помощью UserCreationForm, и у меня не было проблем, мне просто нужно немного разъяснить внутреннюю работу пакета allauth
models.py
# Custom Usermodel
class User(AbstractUser):
pass
# Custom Profile model to store additional info
class Profile(models.Model):
prefix = models.CharField(_('prefix'), max_length=8, blank=True, default="")
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
# Other fields left out for readability
def __str__(self):
if self.prefix:
return '%s %s, %s' % (self.user.last_name, self.prefix, self.user.first_name)
else:
return '%s %s' % (self.user.last_name, self.user.first_name)
# Create a profile record on save
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
else:
instance.profile.save()
forms.py
from django import forms
from allauth.account.forms import SetPasswordField, PasswordField
from .models import User, Profile
class GuestSignUpForm(forms.Form):
first_name = forms.CharField(max_length=30)
prefix = forms.CharField(max_length=8, required=False)
last_name = forms.CharField(max_length=150)
email = forms.EmailField(required=True)
password1 = SetPasswordField()
password2 = PasswordField()
def signup(self, request, user):
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.save()
profile = Profile.objects.get(user=user)
profile.prefix = self.cleaned_data.get['prefix']
profile.save()
return user