2017-05-15 12 views
0

그래서 저는 두 개의 관련 객체 인 GeneralUser와 해당 비즈니스를 생성하기 위해 서브 클래 싱하는 djang 등록 양식을로드하고 있습니다. 아래 코드는 경고와 함께 실패합니다. 저장하지 않은 관련 개체 'owner'로 인한 데이터 손실을 방지하기 위해 save()가 금지되었습니다. 경고 :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