slypete
slypete

Reputation: 5648

Raising ValidationError from django model's save method?

I need to raise an exception in a model's save method. I'm hoping that an exception exists that will be caught by any django ModelForm that uses this model including the admin forms.

I tried raising django.forms.ValidationError, but this seems to be uncaught by the admin forms. The model makes a remote procedure call at save time, and it's not known until this call if the input is valid.

Thanks, Pete

Upvotes: 12

Views: 13702

Answers (2)

Cerin
Cerin

Reputation: 64709

Since Django 1.2, this is what I've been doing:

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)

This has the benefit of working both inside and outside of admin.

Upvotes: 15

Daniel Roseman
Daniel Roseman

Reputation: 599490

There's currently no way of performing validation in model save methods. This is however being developed, as a separate model-validation branch, and should be merged into trunk in the next few months.

In the meantime, you need to do the validation at the form level. It's quite simple to create a ModelForm subclass with a clean() method which does your remote call and raises the exception accordingly, and use this both in the admin and as the basis for your other forms.

Upvotes: 9

Related Questions