在 Django views.py 中保存多个 (onetoonefield) 表单时出错。请,需要正确的工作观点或建议

error when saving multiple (onetoonefield) forms in django views.py. pls, Need correct working view or suggestion

models.py

class CustomUser(AbstractUser):

username = None
email = models.EmailField(_('email address'), unique=True) 
mobileno = models.IntegerField(blank=True, null=True)
is_customer = models.BooleanField(default=False)
is_vendor = models.BooleanField(default=False)

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []

objects = UserManager()

def __str__(self):
    return self.email


class VendorDetails(models.Model):

vendoruser = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
aadhar_number = models.CharField(max_length=200)
pan_number = models.CharField(max_length=200)
store_name = models.CharField(max_length=200)
brand_name = models.CharField(max_length=200)
mail_id = models.EmailField(max_length=200)
contact_no = models.IntegerField(blank=True, null=True)
gst_number = models.CharField(max_length=100)
acct_number = models.CharField(max_length=100)
ifsc_code = models.CharField(max_length=100)
fb_account = models.CharField(max_length=100,blank=True, null=True)
insta_account = models.CharField(max_length=100,blank=True, null=True) 
website = models.CharField(max_length=100,blank=True, null=True)
door_no = models.CharField(max_length=100,blank=True, null=True)
street_name = models.CharField(max_length=100, blank=True, null=True)
city = models.CharField(max_length=100, blank=True, null=True)
pincode = models.IntegerField(blank=True, null=True)



def __str__(self):
    return self.mail_id

forms.py

class UserCreationForm(UserCreationForm):
"""
A Custom form for creating new users.
"""

class Meta:
    model = CustomUser
    fields = ['email','first_name','last_name','mobileno']


 """ For Vendor users forms"""

class VendorAdminDetailsForm(forms.ModelForm):

class Meta:
    model = VendorDetails
    fields = ['aadhar_number', 'pan_number']


class VendorStoreDetailsForm(forms.ModelForm):

class Meta:
    model = VendorDetails
    fields = ['store_name', 'brand_name', 'mail_id', 'contact_no', 'gst_number']


class VendorBankDetailsForm(forms.ModelForm):
class Meta:
    model = VendorDetails
    fields = ['acct_number', 'ifsc_code']


class VendorSocialMediaDetailsForm(forms.ModelForm):

fb_account = forms.CharField(required=False)
insta_account = forms.CharField(required=False) 
website = forms.CharField(required=False)

class Meta:
    model = VendorDetails
    fields = ['fb_account', 'insta_account', 'website']


class VendorContactDetailsForm(forms.ModelForm):

door_no = forms.CharField(required=False)
street_name = forms.CharField(required=False) 
pincode = forms.IntegerField(required=False)

class Meta:
    model = VendorDetails
    fields = ['door_no', 'street_name', 'city', 'pincode']

views.py

 #Vendor Signup
 def VendorSignup(request):
     form = UserCreationForm()
     vendordetail = VendorAdminDetailsForm()
     vendorstore = VendorStoreDetailsForm()
     vendorbankdetail = VendorBankDetailsForm()
     vendorsocialmedia = VendorSocialMediaDetailsForm()
     vendorcontact = VendorContactDetailsForm()

if request.method == 'POST':
    form = UserCreationForm(request.POST)
    vendordetail = VendorAdminDetailsForm(request.POST)
    vendorstore = VendorStoreDetailsForm(request.POST)
    vendorbankdetail = VendorBankDetailsForm(request.POST)
    vendorsocialmedia = VendorSocialMediaDetailsForm(request.POST)
    vendorcontact = VendorContactDetailsForm(request.POST)
    
    if form.is_valid() and vendordetail.is_valid() and vendorstore.is_valid() and vendorbankdetail.is_valid() and vendorsocialmedia.is_valid() and vendorcontact.is_valid():
        form.save()
        print("form")
        vendordetail.save()
        vendorstore.save()
        vendorbankdetail.save()
        vendorsocialmedia.save()
        vendorcontact.save()
        return redirect('login')
else:
    form = UserCreationForm()
    vendordetail = VendorAdminDetailsForm()
    vendorstore = VendorStoreDetailsForm()
    vendorbankdetail = VendorBankDetailsForm()
    vendorsocialmedia = VendorSocialMediaDetailsForm()
    vendorcontact = VendorContactDetailsForm()

我已经创建了多个用于扩展抽象用户模型的注册表单。我也将所有这些表格分别放在模板中。这是处理多种形式的正确方法吗?行中的问题 (vendordetail.save()) 不是空字段(onetoonefield 相关问题)。但我不知道如何为所有形式编写视图。请帮我解决这个问题。

您在哪里插入正确的 vendoruser?需要在调用 save() 之前填写。

您需要执行以下操作:

vendordetail.instance.vendoruser = request.user

如果 vendoruser 确实是当前登录的用户,否则您需要从其他地方获取它。插入后可以调用:

vendordetail.save()

编辑:我错过了您在同一页面上以另一种形式创建您的用户。在这种情况下,您可以先保存您的用户表单:

new_user = form.save()

模型表单的 save() 方法将 return 新对象,因此您之后可以将其用于其他表单:

vendordetail.instance.vendoruser = new_user