所以我正在加载一个djang-registration表单,我为此创建了两个相关对象,一个GeneralUser和他们的Business。以下代码失败并显示警告:
禁止使用save()来防止由于未保存的相关对象'所有者而导致数据丢失。
而且我还得到了警告#34; NoneType对象没有属性所有者"' NoneType'对象没有属性' is_active'"在尝试创建这样的业务时:business = Business(name=self.cleaned_data['business_name'], owner=user)
我只是在寻找一种不承诺对用户或业务进行db的方法,除非我同时进行。请注意我不要查看此表单以查看form.isvalid()
之类的各种内容,因为django-registration正在处理所有这些观看。
class GeneralUserForm(UserCreationForm):
business_name = forms.CharField(required=True)
class Meta:
model = GeneralUser
fields = ['username', 'email', 'password1',
'password2', 'business_name']
def save(self, commit=True):
user = super(GeneralUserForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])
business = Business.objects.create(name=self.cleaned_data['business_name'], owner=user)
if commit:
user.is_active = True # TODO: remove before deployment.
user.save()
business.save()
return user
如何将GeneralUser
与Business
相关联,然后再提交给数据库?
答案 0 :(得分:0)
如果您想这样做,那么首先应该保存用户然后创建Business对象。除非已提交到数据库,否则无法将用户实例与业务对象关联。该关联实际上是与用户对象的主键的关系,该主键仅在提交给db时创建。 只有在提交了用户对象之后,才能保存业务对象。
你可以这样做,
def save(self, commit=True, *args, **kwargs):
user = super(GeneralUserForm, self).save(*args, **kwargs)
user.set_password(self.cleaned_data["password1"])
business = Business(name=self.cleaned_data['business_name'])
if commit:
user.is_active = True
user.save()
business.owner = user
business.save()
return user