Django Forn不保存额外信息

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

我扩展了Django AbstratUser,以便用户可以使用电子邮件登录和注册,这些功能非常有效。然而,我面临的问题是,扩展模型上的额外信息并没有将信息存储在数据库中,即使用户是被创建的。一旦我点击submit按钮,就会创建用户和扩展模型,当用户模型存储信息时,扩展模型总是空的

我试过同时使用
信号
@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