Поднять ValidationError из метода сохранения модели django?

Мне нужно создать исключение в методе сохранения модели. Я надеюсь, что существует исключение, которое будет обнаружено любым django ModelForm, который использует эту модель, включая формы администратора.

Я попытался поднять django.forms.ValidationError, но это, похоже, не удалось обработать формы администратора. Модель выполняет удаленный вызов процедуры в течение экономии времени, и она не известна до этого вызова, если вход действителен.

Спасибо, Пит

Ответ 1

В настоящее время нет способа выполнить проверку в методах сохранения модели. Это, однако, разрабатывается как отдельная ветвь валидации модели и в ближайшие несколько месяцев следует объединить в магистраль.

Тем временем вам нужно выполнить проверку на уровне формы. Очень просто создать подкласс ModelForm с помощью метода clean(), который делает ваш удаленный вызов и соответственно создает исключение, и использовать его как в админке, так и в качестве основы для ваших других форм.

Ответ 2

Начиная с Django 1.2, это то, что я делал:

class MyModel(models.Model):

    <...model fields...>

    def clean(self, *args, **kwargs):
        if <some constraint not met>:
            raise ValidationError('You have not met a constraint!')
        super(MyModel, self).clean(*args, **kwargs)

    def full_clean(self, *args, **kwargs):
        return self.clean(*args, **kwargs)

    def save(self, *args, **kwargs):
        self.full_clean()
        super(MyModel, self).save(*args, **kwargs)

Это полезно для работы как внутри, так и снаружи администратора.