因此,我有一个使用自定义UserModel的项目,默认UserModel已扩展为使用与UserModel具有OneToOne关系的Profile模型。
我想使用django allauth验证电子邮件地址并添加社交登录名。
自定义注册有一些问题,我已经阅读了以下How to customize user profile when using django-allauth,但是目前尚不清楚如何实现此目标,但出现错误;
“ GuestSignUpForm”对象没有属性“保存”
我在论坛上进行了搜索,似乎没有关于此操作的“官方”文档,有些人使用ModelForms,其他人从SignUpView继承,一些def注册,另一些使用def save ...
我尝试使用UserCreationForm自定义默认的UserModel,没有任何问题,我只需要对allauth软件包的内部工作进行一些澄清
# 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()
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