2014-12-21 3 views
1

고객을 정의 할 수있는 다음 모델이 있습니다. 나는 주소와 '사람'필드를 분리 된 모델로 분리하는 재사용을 생각했다. 고객에는 주소가있는 사람이 포함되어 있으므로 고객을 위해 CreateView를 작성하려면 어떻게해야합니까? inline_formset과 같은 것을 사용하여 원하는 것을 성취하는 방법을 잘 이해하지 못합니다.모델의 장고 양식

models.py : 당신은 아마 look at using an inline formset 싶지는 매우 정직하고

주소 필드에서
import localflavor.us.models as us_models 
from django.db import models 
from datetime import date 

class Address(models.Model): 
    address1 = models.CharField(max_length=100) 
    house_number = models.CharField(max_length=10, blank=True) 
    address2 = models.CharField(max_length=100, blank=True) 
    city = models.CharField(max_length=50) 
    state = us_models.USStateField() 
    zip = models.CharField(max_length=5) 


class Person(models.Model): 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 
    creation_date = models.DateTimeField('date created') 
    home_phone = us_models.PhoneNumberField() 
    work_phone = us_models.PhoneNumberField(blank=True) 
    cell_phone = us_models.PhoneNumberField(blank=True) 
    email = models.EmailField(blank=True) 
    address = models.OneToOneField(Address, primary_key=True) 


class Customer(models.Model): 
    person = models.OneToOneField(Person, primary_key=True, default=None) 
    creation_date = models.DateTimeField('date created', auto_now_add=True) 

답변

1

. 약간의 코드가 필요하지만 자습서는 아주 간단합니다.

그러나 Person/Customer 문제의 경우 모델이 첫 번째이자 가장 중요한 Python 객체이므로 잊지 말고 많은 OOP 상속 원칙을 사용할 수 있습니다. Customer 인 경우 Person 문서 그 다음은

class Person(models.Model): 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 
    # ... fields trimmed ... 
    address = models.OneToOneField(Address, primary_key=True) 

class Customer(person): 
    creation_date = models.DateTimeField('date created', auto_now_add=True) 

우리가 명확하게 관계를 정의한과의 관계가 무대 뒤에서 돌보아 준다. 그러나 중요한주의 사항으로, 이름과 덧셈자는 여전히 Person 테이블에 있으므로 Person에 대한 쿼리는 Customer도 반환합니다.

또 다른 대안이 같은, using an abstract class입니다 : 이제

class Person(models.Model): 
    class Meta: 
     abstract = True 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 
    # ... fields trimmed ... 
    address = models.OneToOneField(Address, primary_key=True) 

class Customer(person): 
    creation_date = models.DateTimeField('date created', auto_now_add=True) 
class Retailer(person): 
    creation_date = models.DateTimeField('date created', auto_now_add=True) 

는 Person 객체는 데이터베이스 테이블을받지 않습니다, 단지 상속을 통해 사용할 수 있습니다 - 그래서 우리는 Customer의 또는 Retailer의 쿼리 수 ( Person)이 아닙니다.

+0

자세한 답변을 보내 주셔서 감사합니다. 고객에게 매우 좋은 점은 사람입니다. 나는 유스 케이스에 더 적합한 추상 경로를 사용했다. 나는 아직도 HAS A 관계에 대한 양식을 만드는 방법을 알지 못한다. 고객은이 경우 주소를 가지고있다. 당신이 제공 한 링크는 inlineformset_factory (Address, Customer)를 사용하고 뷰 내에서 그 Set과 동일한 형태를 사용한다고 말했습니다. 이제 양식은 Person의 모든 필드를 표시하지만 Address의 모든 필드를 표시하는 대신 선택할 대상 드롭 다운 목록으로 주소 만 갖습니다. – postelrich