Проверка размера изображения в django admin

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

Я хочу иметь ImageField, где я заставляю пользователя загружать изображение размером 100x200. Если изображение, которое они загружают, не соответствует этому размеру, я хочу, чтобы форма администратора возвращалась как недействительная. Я также хотел бы иметь возможность сделать то же самое для пропорций. Я хочу заставить пользователя загрузить изображение с 16: 9 и отклонить любую загрузку, которая не соответствует.

Я уже знаю, как получить ширину и высоту изображения, но я не могу сделать эту серверную сторону до тех пор, пока изображение уже не будет загружено, и форма будет отправлена ​​успешно. Как я могу проверить это раньше, если это возможно?

Ответ 1

Правильное место для этого - во время проверки формы.
Быстрый пример (отредактируйте/интегрируйте с дополнительной информацией позже):

from django.core.files.images import get_image_dimensions
from django.contrib import admin
from django import forms

class myForm(forms.ModelForm):
   class Meta:
       model = myModel
   def clean_picture(self):
       picture = self.cleaned_data.get("picture")
       if not picture:
           raise forms.ValidationError("No image!")
       else:
           w, h = get_image_dimensions(picture)
           if w != 100:
               raise forms.ValidationError("The image is %i pixel wide. It supposed to be 100px" % w)
           if h != 200:
               raise forms.ValidationError("The image is %i pixel high. It supposed to be 200px" % h)
       return picture

class MyAdmin(admin.ModelAdmin):
    form = myForm

admin.site.register(Example, MyAdmin)

Ответ 2

используйте эту функцию в файле модели,

from django.core.exceptions import ValidationError

def validate_image(fieldfile_obj):
    filesize = fieldfile_obj.file.size
    megabyte_limit = 2.0
    if filesize > megabyte_limit*1024*1024:
        raise ValidationError("Max file size is %sMB" % str(megabyte_limit))

class Company(models.Model):
    logo = models.ImageField("Logo", upload_to=upload_logo_to,validators=[validate_image], blank=True, null=True,help_text='Maximum file size allowed is 2Mb')

Ответ 3

Это может быть обман/очень похожий на этот вопрос:

Использование jQuery, ограничение размера файла перед загрузкой

Я не думаю, что есть способ сделать это так, как вы хотите. Решение Agos - это путь...

Изменить: Один из ответов в связанном SO-вопросе говорит об использовании flash для этого. Поэтому, хотя это может быть связано с некоторыми другими технологиями, я не думаю, что вы можете сделать это с помощью прямого javascript.