2010-02-13 4 views
7

이의 내가 같이 기본 auth.models.User 플러스 내 사용자 정의 ProfileAddress 모델을 사용하고 있다고 가정 해 봅시다 : OneToOne 관계가있는 장고 모델은 무엇입니까?

class Profile(models.Model): 
    user = models.OneToOneField(User) 
    primary_phone = models.CharField(max_length=20) 
    address = models.ForeignKey("Address") 

class Address(models.Model): 
    country = CountryField(default='CA') 
    province = CAProvinceField(default='BC') 
    city = models.CharField(max_length=80) 
    postal_code = models.CharField(max_length=6) 
    street1 = models.CharField(max_length=80) 
    street2 = models.CharField(max_length=80, blank=True, null=True) 
    street3 = models.CharField(max_length=80, blank=True, null=True) 

가 지금은 등록 양식을 만들려고합니다. User을 기반으로 ModelForm을 만들 수 있지만 ProfileAddress (필수 사항) 필드는 포함하지 않습니다. 이 양식을 작성하는 가장 좋은 방법은 무엇입니까? ModelForm을 사용해야합니까?

또한 복잡한 개체를 편집 할 때 동일한 양식을 어떻게 사용합니까? 필자는 Profile의 인스턴스를 쉽게 전달할 수 있습니다.이 인스턴스에는 필요한 Address 및 Profile 객체에 대한 참조가 들어 있지만 그 필드를 채워 넣으려면 어떻게해야합니까?

+2

@ 마크 귀하의 예에서는 작성하기 전에 '주소'를 참조했습니다. 따옴표로 싸서 따옴표를 사용하지 않으려면'Address' 아래의'Profile'을 움직여야합니다. – orokusaki

+0

@orokusaki : 두 개의 다른 위치에서 붙여 넣은 것 같습니다. 그렇지 않으면 오류가 발생했습니다. 내가 따옴표를 사용할 수 있다는 것을 몰랐다. 감사. – mpen

답변

8

무엇 세 별도의 ModelForm 사용에 대한. Address에 대한 하나의, User 하나, 그리고 Profile뿐만 하나 :

다음
class ProfileForm(ModelForm): 
    class Meta: 
    model = Profile 
    exclude = ('user', 'address',) 

,이 3 개 형태 별도로 뷰에서 처리.특히, ProfileForm의 인스턴스 useraddress 필드를 업데이트 할 commit=Falsesave를 사용

# ... 
profile_form = ProfileForm(request.POST) 
if profile_form.is_valid(): 
    profile = profile_form.save(commit=False) 
    # `user` and `address` have been created previously 
    # by saving the other forms 
    profile.user = user 
    profile.address = address 

확인 행이 세 형태가 유효한 경우에만 삽입 얻을 수 여기에 트랜잭션을 사용하는 것을 망설이지 말라.

+0

이것이 갈 길이 란 것 같습니다. 나는 그것에 대해 행복하지 않지만 작동하는 유일한 것입니다. ForeignKeys/OneToOnes가 기존 객체가있는 '