Django Allauth如何保存额外的信息字段

32 阅读1分钟

用户在使用Django Allauth扩展注册表单时,发现无法保存额外的字段信息,也没有收到任何错误信息,所有内容似乎都运行正常,除了额外的字段没有被保存。

class SignupForm(forms.Form):

    first_name = forms.CharField(max_length=30, label='First Name')
    last_name = forms.CharField(max_length=30, label='Last Name')
    home_number = forms.IntegerField(label='Home Number')
    mobile_number = forms.IntegerField(label='Mobile Number')
    business_name = forms.CharField(label='Business Name')
    business_address_number = forms.IntegerField(label='Street Number')
    business_address_street = forms.CharField(label='Street Name')
    business_address_region = forms.ChoiceField(choices=EmployerProfile.region_choice, label='Region')
    business_address_suburb = forms.ChoiceField(choices=EmployerProfile.suburb_choice, label='Suburb')
    business_address_postcode = forms.IntegerField(label='Postcode')
    business_industry = forms.ChoiceField(choices=EmployerProfile.industry_choice, label='Industry')

    def signup(self, request, user):
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.home_number = self.cleaned_data['home_number']
        user.mobile_number = self.cleaned_data['mobile_number']
        user.business_name = self.cleaned_data['business_name']
        user.business_address_number = self.cleaned_data['business_address_number']
        user.business_address_street = self.cleaned_data['business_address_street']
        user.business_address_region = self.cleaned_data['business_address_region']
        user.business_address_suburb = self.cleaned_data['business_address_suburb']
        user.business_address_postcode = self.cleaned_data['business_address_postcode']
        user.business_industry = self.cleaned_data['business_industry']

        user.save()

    class Meta:
        model = EmployerProfile

解决方法

问题的原因在于signup函数中,将字段值保存到用户模型中时,使用的字段名称与模型中的字段名称不一致。例如,user.home_number = self.cleaned_data['home_number'],但模型中的字段名为home_number_mobile

正确的代码应该是:

class SignupForm(forms.Form):

    first_name = forms.CharField(max_length=30, label='First Name')
    last_name = forms.CharField(max_length=30, label='Last Name')
    home_number_mobile = forms.IntegerField(label='Home Number')
    mobile_number = forms.IntegerField(label='Mobile Number')
    business_name = forms.CharField(label='Business Name')
    business_address_number = forms.IntegerField(label='Street Number')
    business_address_street = forms.CharField(label='Street Name')
    business_address_region = forms.ChoiceField(choices=EmployerProfile.region_choice, label='Region')
    business_address_suburb = forms.ChoiceField(choices=EmployerProfile.suburb_choice, label='Suburb')
    business_address_postcode = forms.IntegerField(label='Postcode')
    business_industry = forms.ChoiceField(choices=EmployerProfile.industry_choice, label='Industry')

    def signup(self, request, user):
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.home_number_mobile = self.cleaned_data['home_number_mobile']
        user.mobile_number = self.cleaned_data['mobile_number']
        user.business_name = self.cleaned_data['business_name']
        user.business_address_number = self.cleaned_data['business_address_number']
        user.business_address_street = self.cleaned_data['business_address_street']
        user.business_address_region = self.cleaned_data['business_address_region']
        user.business_address_suburb = self.cleaned_data['business_address_suburb']
        user.business_address_postcode = self.cleaned_data['business_address_postcode']
        user.business_industry = self.cleaned_data['business_industry']

        user.save()

    class Meta:
        model = EmployerProfile

修改后,额外的字段信息就可以正常保存了。