我有两个用于应用程序逻辑的类。一个叫做Direction,另一个叫做Compass。 Direction是Compass的成员。我想要实现的是一个modelField,它包装了Direction类,我可以用作Compass模型中的一个成员。 DirectionField类继承自models.CharField并设置父类的选择。
我认为这是一个很好的设计,因为我可以在许多其他类中使用DirectionField,并且它易于维护。但是,当我在Django的Admin页面中保存Compass模型时出现错误。错误是 "价值不是一个有效的选择。"
我使用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
我在保存指南针时获得的管理页面(或表单视图)出错:
Value <src.bo.tgEnum.Direction instance at 0x03E97E18> is not a valid choice.
答案 0 :(得分:1)
要传递字段验证,您需要将此函数添加到Direction类:
def __eq__(self, value):
return self.value == value
def __len__(self):
return len(self.value)
因为它将值与选择键进行比较,并且值具有字典类型,所以键是字符串。