Django:在提交之前关联对象

时间:2017-05-15 14:47:01

标签: python django django-registration

所以我正在加载一个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

如何将GeneralUserBusiness相关联,然后再提交给数据库?

1 个答案:

答案 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