Django Forn不保存额外信息
我扩展了Django AbstratUser,以便用户可以使用电子邮件登录和注册,这些功能非常有效。然而,我面临的问题是,扩展模型上的额外信息并没有将信息存储在数据库中,即使用户是被创建的。一旦我点击submit按钮,就会创建用户和扩展模型,当用户模型存储信息时,扩展模型总是空的 我试过同时使用Django Forn不保存额外信息,django,django-models,django-forms,Django,Django Models,Django Forms,我扩展了Django AbstratUser,以便用户可以使用电子邮件登录和注册,这些功能非常有效。然而,我面临的问题是,扩展模型上的额外信息并没有将信息存储在数据库中,即使用户是被创建的。一旦我点击submit按钮,就会创建用户和扩展模型,当用户模型存储信息时,扩展模型总是空的 我试过同时使用信号和@transaction\u atomic,但我一直没能弄明白。也许我错过了什么,我不知道 Models.py class Company(models.Model): user = mod
信号
和@transaction\u atomic
,但我一直没能弄明白。也许我错过了什么,我不知道
Models.py
class Company(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, primary_key=True)
name= models.CharField(_('Company name'), max_length=250)
...
#more information
...
class Meta:
verbose_name = _('Company')
verbose_name_plural = _('Companies')
def __str__(self):
return self.name
forms.py
class CompanySignUpForm(CustomUserCreationForm):
name = forms.CharField(widget=TextInput(attrs={'placeholder': 'Company name'}))
...
#more fields
...
class Meta(CustomUserCreationForm.Meta):
model = User
@transaction.atomic
def save(self):
user = super().save(commit=False)
user.is_company = True
user.save()
company = Company.objects.create(user=user)
company.name = self.cleaned_data.get('name')
...
#more information
...
return user
Views.py
def company_signup(request):
if request.method == 'POST':
form = CompanySignUpForm(request.POST)
if form.is_valid():
form.save()
return render(request, 'accounts/templates/company_success.html')
else:
form = CompanySignUpForm()
return render(request, 'accounts/templates/company_signup.html', context={
'title': _('Create a Company Account'),
'form': form,
})
编辑:
感谢@Mandrup,我能够扩展他的解决方案以满足我的需要
forms.py
class CompanySignUpForm(CustomUserCreationForm):
name = forms.CharField(widget=TextInput(attrs={'placeholder': 'Company name'}))
number_of_employees = forms.CharField(widget=NumberInput(attrs={'placeholder': 'Number of employees'}))
phone = forms.CharField(widget=TextInput(attrs={'placeholder': 'Contact Number'}))
country = forms.ModelChoiceField(queryset=Country.objects.all(), required=True, empty_label="Country")
class Meta(CustomUserCreationForm.Meta):
model = User
@transaction.atomic
def save(self, commit=True):
user = super(CompanySignUpForm, self).save(commit=False)
if commit:
user.is_company = True
user.save()
name = self.cleaned_data.get('name')
number_of_employees = self.cleaned_data.get('number_of_employees')
phone = self.cleaned_data.get('phone')
country = self.cleaned_data.get('country')
company = Company(user=user, name=name, number_of_employees=number_of_employees, phone=phone, country=country)
company.save()
return user
编辑:
当我试图创建一个扩展的用户配置文件时,这对我来说很有效。我把它改成适合你的需要
型号:
class Company(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, primary_key=True)
name= models.CharField(max_length=250)
...
#more information
...
def __str__(self):
return self.name
表格:
正如我之前解释的,我尝试了信号,但它不起作用。事实上,只要我使用信号,公司对象就不会被创建。但是如果我使用transaction_atomic,它会被创建,但信息不会被保存。嗯,这很奇怪。我能够扩展您的解决方案以满足我的需要。问题解决了!谢谢你,Mandrup
class RegisterUserForm(UserCreationForm):
class Meta:
model = User
fields = ["username", "email", "password1", "password2"]#add whatever fields you want to here
def save(self, commit=True):
user = super(RegisterUserForm, self).save(commit=False)
if commit:
user.save()
company = Company(user=user, name='Company name')
company.save()
return user