【问题标题】:Django inheritance from models.CharField with choices gives error从 models.CharField 继承的 Django 有选择给出错误
【发布时间】:2012-12-13 01:56:48
【问题描述】:

我有两个用于应用程序逻辑的类。一个叫做方向,另一个叫做指南针。方向是指南针的成员。我要实现的是一个包装了 Direction 类的 modelField,我可以将其用作 Compass 模型中的成员。 DirectionField 类继承自 models.CharField 并设置父类的选项。

我认为这是一个不错的设计,因为我可以在许多其他类中使用 DirectionField,而且它易于维护。但是,当我在 Django 的管理页面中保存 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

保存 Compass 时出现的管理页面(或表单视图)错误:

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

【问题讨论】:

  • 是否有理由说明您为什么不在 CompassForm 上调用 super 来获取 clean_data 的值? clean_data = super(CompassForm, self).clean()

标签: python django forms models


【解决方案1】:

要通过字段验证,您需要将此函数添加到 Direction 类:

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

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

因为它将值与选择键进行比较,并且值具有字典类型,所以键是字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    相关资源
    最近更新 更多