首页 > 解决方案 > django allauth 适配器注册:禁止保存()以防止由于未保存的相关对象“用户”而导致数据丢失

问题描述

我正在使用 Django 和 Allauth。我需要用户能够使用附加字段进行注册,所以我创建了一个自定义用户调用配置文件、一个自定义 SignupForm 和一个适配器,但是当我提交时我收到错误“ save() disabled to prevent data loss due to unsaved related对象'用户' ”。

自定义表格

 class CustomSignupForm(SignupForm):
        first_name = forms.CharField(
            max_length=200,
            label='Nome*',
            widget=forms.TextInput(attrs={'placeholder': 'Il tuo nome'}),
            required=True
        )
        last_name = forms.CharField(
            max_length=200,
            label='Cognome*',
            widget=forms.TextInput(attrs={'placeholder': 'Il tuo cognome'}),
            required=True
        )

        etc...

        def signup(self, request, user):
            user.email = self.cleaned_data['email']
            user.first_name = self.cleaned_data['first_name']
            user.last_name = self.cleaned_data['last_name']
            user.address = self.cleaned_data['address']
            user.cap = self.cleaned_data['cap']
            user.city = self.cleaned_data['city']
            user.province = self.cleaned_data['province']
            user.state = self.cleaned_data['state']
            user.pi = self.cleaned_data['pi']
            user.cf = self.cleaned_data['cf']
            user.save()

适配器

class AccountAdapter(DefaultAccountAdapter):

    def save_user(self, request, user, form, commit=False):
        data = form.cleaned_data
        user.email = data['email']
        user.first_name = data['first_name']
        user.last_name = data['last_name']
        user.address = data.get('address')
        user.cap = data['cap']
        user.city = data['city']
        user.province = data['province']
        user.state = data['state']
        user.pi = data['pi']
        user.cf = data['cf']
        if 'password1' in data:
            user.set_password(data['password1'])
        else:
            user.set_unusable_password()
        self.populate_username(request, user)
        if commit:
            user.save()
        return user

自定义用户模型(配置文件)

class Profile(AbstractUser):
    artist_name = models.CharField(max_length=200, blank=True, null=True)
    address = models.CharField(max_length=200, null=True)
    cap = models.PositiveIntegerField(null=True)
    city = models.CharField(max_length=200, null=True)
    province = models.CharField(max_length=200, null=True)
    state = models.CharField(max_length=200, null=True)
    pi = models.CharField(max_length=200, blank=True, null=True)
    cf = models.CharField(max_length=200, blank=True, null=True)
    bio = models.TextField(blank=True, null=True)
    image = models.ImageField(blank=True, null=True)
    instagram_url = models.URLField(blank=True, null=True)
    facebook_url = models.URLField(blank=True, null=True)
    twitter_url = models.URLField(blank=True, null=True)
    soundcloud_url = models.URLField(blank=True, null=True)
    credits = models.PositiveIntegerField(default=2)

    def __str__(self):
        return self.email

设置.py

    ACCOUNT_EMAIL_REQUIRED = True
    ACCOUNT_USERNAME_REQUIRED = False
    ACCOUNT_USER_MODEL_USERNAME_FIELD = None
    ACCOUNT_EMAIL_VERIFICATION = 'mandatory'
    ACCOUNT_AUTHENTICATION_METHOD = 'email'
    AUTH_USER_MODEL = 'profiles.Profile'
    ACCOUNT_ADAPTER = 'main.adapter.AccountAdapter'

    ACCOUNT_FORMS = {
        'signup': 'main.forms.CustomSignupForm',
    }

我的代码有什么问题?

标签: pythondjango

解决方案


尝试save在您的表单类上添加一个方法:

class CustomSignupForm(SignupForm):
# ...
    def save(self, user):
        user.save()

推荐阅读