Проверка поля администратора Django для возврата ошибки, а не для исключения в приложении

У меня есть модель Django, в которой есть поле для загрузки изображений, я пытаюсь проверить поле изображения, чтобы проверить размер изображения перед сохранением и вернуть элегантное сообщение об ошибке, которое пользователь может исправить.

Я пытался использовать следующий код, но он не работал

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()

Целый clean_image() не вызывается, я также пытался изменить имя на image_clean(), но также не работал. В любом случае, я попытался переместить проверку в 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()

теперь второй кусок кода работает нормально, он проходит процесс проверки, но не показывает простого сообщения об ошибке. Вместо этого он выбрасывает исключение! Как я могу заставить его показать ошибку, чтобы пользователь мог исправить и попытаться снова?

PS я использую django 1.4 и django-hvad для перевода, поэтому я наследую от TranslatableAdmin

С уважением

2 ответа

Решение

Как сказал demalexx, вы должны использовать дополнительную форму для проверки вашей модели.

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

Используйте любую проверку в вашей форме администратора:

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

И простой автоматически сгенерированный админ:

class BonanzaAdmin(admin.ModelAdmin):
    form = BonanzaAdminForm

admin.site.register(Bonanza, BonanzaAdmin)

Вы наследуете ModelAdmin и у него нет методов проверки. Вместо этого вы должны переопределить form атрибут для предоставления настраиваемой формы и добавления метода проверки к этой форме. Есть документы о пользовательской проверке в админке: https://docs.djangoproject.com/en/1.4/ref/contrib/admin/

Другие вопросы по тегам