2017-05-15 5 views
0

私はdjang-registrationフォームをロードしています。これは、2つの関連するオブジェクト、GeneralUser、およびそのビジネスを作成するためにサブクラス化しています。以下のコードは、警告で失敗します:Django:コミットする前にアソシエートするオブジェクト

save()保存されていない関連オブジェクト '所有者'によるデータの損失を防止することは禁止されています。

そして、私はそうのようなビジネスを作成しようとすると「NoneType」オブジェクトは、「「is_active」は属性を持っていない「NoneTypeのオブジェクトが属性の所有者はいない」の静脈に警告をも持っている:business = Business(name=self.cleaned_data['business_name'], owner=user)

I私は同時にそれをやっていない限り、ユーザまたはビジネスのどちらにもdbにコミットしない方法を探しています。form.isvalid()のようなものをチェックするためのこのフォームのビューがあります。django登録はすべてのそれらの意見を世話している。

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に関連付けて、DBにコミットする方法を教えてください。

+0

チェックを行うことができます。 – pramod

+0

@pramodしかし、DBに作成されるまで、ユーザは属性idを持っていませんか? – zerohedge

答えて

0

まず、ユーザーを保存してからビジネスオブジェクトを作成する必要があります。 dbにコミットしていない限り、ユーザー・インスタンスをビジネス・オブジェクトに関連付けることはできません。この関連付けは、実際にはdbにコミットされたときにのみ作成されるユーザーオブジェクトの主キーとの関係です。 ユーザーオブジェクトのコミット後にのみ、ビジネスオブジェクトを保存できます。

それは、あなたがビジネスをコミットすることができている場合、ユーザは、属性「ID」を持っている場合は、このような何か、

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 
+0

私はこれを試したと思うし、それは動作しません。それは、関係を関連付けるときにユーザーがデータベースに保持されないために不平を言う。 – zerohedge

+0

コードを更新しました。 – zaidfazil

+0

これはエラーを返します。* NoneType 'オブジェクトに属性がありません' is_active '* – zerohedge

関連する問題