Django admin field validation to return error not raise exception in application

Mo J. Mughrabi picture Mo J. Mughrabi · Sep 23, 2012 · Viewed 8.3k times · Source

I have a Django model where it has an upload field for images, am trying to validate the image field to check image size before storing and return elegant error message for the user to correct.

I tried to use the following code but it did not work

admin.py

class BonanzaAdmin(TranslatableAdmin):
    list_display = ['get_bonanza_name', 'user_profile', 'publish_date', 'created_by', 'created_at', 'all_translations']

    def clean_image(self):

        image = self.cleaned_data.get('image')
        if not image:
            raise forms.ValidationError("No image!")
        else:
            w, h = get_image_dimensions(image)
            if w != 1170:
                raise forms.ValidationError("The image is %i pixel wide. It's supposed to be 1170px" % w)
            if h != 500:
                raise forms.ValidationError("The image is %i pixel high. It's supposed to be 500px" % h)
        return image 


    def save_model(self, request, obj, form, change):
        if not change:
            obj.created_by = request.user
        obj.save()

The whole clean_image() is not being called, i also tried to reverse the name to image_clean() but also didn't work. Any ways, i tried to move the validation to the save_model

class BonanzaAdmin(TranslatableAdmin):
    list_display = ['get_bonanza_name', 'user_profile', 'publish_date', 'created_by', 'created_at', 'all_translations']


    def save_model(self, request, obj, form, change):
        image = obj.image
        if not image:
            raise forms.ValidationError("No image!")
        else:
            w, h = get_image_dimensions(image)
            if w != 1170:
                raise forms.ValidationError("The image is %i pixel wide. It's supposed to be 1170px" % w)
            if h != 500:
                raise forms.ValidationError("The image is %i pixel high. It's supposed to be 500px" % h)
        if not change:
            obj.created_by = request.user
        obj.save()

now the second piece of code works fine, it goes through the validation process but it does not show a simple error message. Instead, it throws an exception! how can i make it show an error so the user would correct and try again?

P.S am using django 1.4 and django-hvad for translation that's why am inheriting from TranslatableAdmin

Regards

Answer

Aleksej Vasinov picture Aleksej Vasinov · Sep 23, 2012

As demalexx said, you should use additional form to validate your model.

class Bonanza(models.Model):
    user_profile = models.CharField(max_length = 128)
    publish_date = models.DateField()

Use any validation in your admin form:

class BonanzaAdminForm(forms.ModelForm):
    class Meta:
        model = Bonanza
    def clean(self):
        # Validation goes here :)
        raise forms.ValidationError("TEST EXCEPTION!")

And simple auto-generated admin:

class BonanzaAdmin(admin.ModelAdmin):
    form = BonanzaAdminForm

admin.site.register(Bonanza, BonanzaAdmin)