用户在使用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
修改后,额外的字段信息就可以正常保存了。