具有自定义用户模型的Django全部身份验证自定义注册表单

时间:2019-01-17 18:41:43

标签: python django django-allauth

因此,我有一个使用自定义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软件包的内部工作进行一些澄清

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

0 个答案:

没有答案