1

アプリケーション ロジックで使用される 2 つのクラスがあります。1 つは方向と呼ばれ、もう 1 つはコンパスと呼ばれます。方向はコンパスのメンバーです。私が実装しようとしているのは、Direction クラスをラップし、Compass モデルのメンバーとして使用できる modelField です。DirectionField クラスは models.CharField から継承し、親クラスから選択肢を設定します。

DirectionField は他の多くのクラスで使用でき、保守も簡単なので、これは良い設計だと思います。ただし、コンパス モデルを Django の管理ページに保存するとエラーが発生します。エラーは「値は有効な選択ではありません」です。

Python 2.7 と Django 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

Compass を保存すると、管理ページ (またはフォーム ビュー) に次のエラーが表示されます。

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

1 に答える 1

1

フィールドの検証に合格するには、この関数を Direction クラスに追加する必要があります。

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

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

値を選択肢キーと比較し、値は Dictionary 型であるため、キーは文字列です。

于 2012-12-13T10:35:15.643 に答える