自定义模型验证器不适用于编辑

时间:2011-05-17 17:56:31

标签: django django-models django-admin

我为我的模型写了一个验证器:

def validate_is_default(value):
    if Wizard.objects.filter(set_as_default=True).count() == 1:
        if value is True:
            raise ValidationError(_('You can mark only one configuration as default'))
        else:
            raise ValidationError(_('You have to mark one configuration as default'))

我使用它时有模型:

class MyModel(models.Model):
    name = models.CharField(_('Wizard name'), default='Default', max_length=32, blank=False)
    ...
    set_as_default = models.BooleanField(_('Set as default setup'), default=False, validators=[validate_is_default])

在验证器中,我想检查数据库中是否只有一条具有set_as_default = True的记录。这在我添加新记录时工作正常,但在我尝试编辑新记录时失败。怎么解决这个问题?

我在管理面板中使用它。我不想更改默认表单,但使用此验证器以某种方式解决它。有可能吗?

1 个答案:

答案 0 :(得分:2)

根据您的数据库后端,使用models.BooleanField的列并不总是由Django给予Python值TrueFalse(特别是,如果您使用的是MySQL,那么'我会回到10因为MySQL没有布尔类型而Django只使用了一个tinyint。

因此,只需编写if value is True:而不是条款if value:。像这样:

def validate_is_default(value):
    if Wizard.objects.filter(set_as_default=True).count() == 1:
        if value:
            raise ValidationError(_('You can mark only one configuration as default'))
        else:
            raise ValidationError(_('You have to mark one configuration as default'))

您没有提供足够的信息让我最终确定这是您的问题,但很可能就是这样。