Пользовательский валидатор модели не работает при редактировании - PullRequest
0 голосов
/ 17 мая 2011

Я написал валидатор для моей модели:

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 Ответ

2 голосов
/ 18 мая 2011

В зависимости от вашей базы данных, столбцы, использующие models.BooleanField, не всегда будут получать значения Python True и False от Django (в частности, если вы используете MySQL, вы получите обратно 1 или 0, поскольку 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'))

Вы не предоставили мне достаточно информации, чтобы окончательно заявить, что это ваша проблема, но, скорее всего, это так.

...