2012-12-13 2 views
1

저는 응용 프로그램 논리에 사용되는 두 개의 클래스가 있습니다. 하나는 Direction이라고하고 다른 하나는 Compass라고 부릅니다. 방향은 나침반의 구성원입니다. 구현하고자하는 것은 Direction 클래스를 래핑하고 model 클래스의 멤버로 사용할 수있는 modelField입니다. DirectionField 클래스는 models.CharField를 상속 받아 부모 클래스의 선택 항목을 설정합니다.Django는 models.CharField에서 선택을 통해 오류를 제공합니다.

많은 다른 클래스에서 DirectionField를 사용할 수 있고 유지하기가 쉽기 때문에이 디자인이 좋다고 생각합니다. 그러나 장고의 관리자 페이지에 나침반 모델을 저장하면 오류가 발생합니다. 오류는 입니다. "유효한 값이 아닙니다."

저는 파이썬 2.7과 장고 1.4를 사용합니다.

누군가가이 문제를 검토하고 문제가 무엇이며 어떻게 해결할 수 있는지 제안 해주십시오. 내가 저장할 때 나침반 관리 페이지 (또는 양식보기)에서

class Direction(): 
    choices = (('N','North'), 
       ('S','South'), 
       ('E','East'), 
       ('W','West'),) 

    def __init__(self, value=None): 
     self.value = value 

class DirectionField(models.CharField): 

    def __init__(self, *args, **kwargs): 
     super(DirectionField, self).__init__(choices=Direction.choices, 
              *args, **kwargs) 

    __metaclass__ = models.SubfieldBase 

    def to_python(self, value): 
     if isinstance(value, Direction) or value is None: 
      return value 
     return Direction(value) 

    def get_prep_value(self, value): 
     return value.value 

class Compass(models.Model): 
    name = models.CharField(max_length=20) 
    direction = modelFields.DirectionField(max_length=10) 
    class Meta: 
     db_table = 'campass' 
    def __unicode__(self): 
     return "%s/%s" % (self.name, self.direction)  

class CompassForm(forms.ModelForm): 
    class Meta: 
     model = Compass 
    def clean(self): 
     return self.cleaned_data 

오류 내가 얻을 : 당신이 추가 할 필요가

Value <src.bo.tgEnum.Direction instance at 0x03E97E18> is not a valid choice. 
+0

왜 cleaned_data 값을 얻기 위해 CompassForm에서 super를 호출하지 않는 이유가 있습니까? cleaned_data = super (CompassForm, self) .clean() – Paulo

답변

1

필드 유효성 검사를 통과하려면 여기

소스입니다 방향 클래스에 함수 :

def __eq__(self, value): 
    return self.value == value 

def __len__(self): 
    return len(self.value) 

값을 선택 키와 비교하고 값에 사전 유형이 있기 때문에 키 문자열입니다.

관련 문제