アプリケーション ロジックで使用される 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.