python django image django-forms python-imaging-library

python - Valide el tamaño de la imagen en django admin



django-forms python-imaging-library (3)

usa esta función en tu archivo de modelo,

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

Veo a mucha gente con las aplicaciones de Django que tienen cargas de imágenes que redimensionan automáticamente las imágenes después de que se cargan. Eso está bien y bien para algunos casos, pero no quiero hacer esto. En cambio, simplemente quiero forzar al usuario a cargar un archivo que ya tiene el tamaño adecuado.

Quiero tener un ImageField donde obligo al usuario a subir una imagen que es 100x200. Si la imagen que cargan no es exactamente de ese tamaño, quiero que el formulario de administrador no sea válido. También me gustaría poder hacer lo mismo para las relaciones de aspecto. Quiero forzar al usuario a cargar una imagen que sea 16: 9 y rechazar cualquier carga que no se ajuste.

Ya sé cómo obtener el ancho y el alto de la imagen, pero no puedo hacerlo desde el lado del servidor hasta que la imagen ya esté cargada, y el formulario se envíe con éxito. ¿Cómo puedo verificar esto antes, si es posible?


El lugar correcto para hacer esto es durante la validación del formulario.
Un ejemplo rápido (se editará / integrará con más información más adelante):

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''s supposed to be 100px" % w) if h != 200: raise forms.ValidationError("The image is %i pixel high. It''s supposed to be 200px" % h) return picture class MyAdmin(admin.ModelAdmin): form = myForm admin.site.register(Example, MyAdmin)


Esto puede ser una trampa / muy similar a esta pregunta:

Uso de jQuery, restricción del tamaño del archivo antes de la carga

No creo que haya una manera de hacerlo de la manera que desee. La solución Agos es el camino a seguir ...

Editar: Una de las respuestas en la pregunta vinculada SO habla sobre el uso de flash para hacerlo. Entonces, si bien es posible hacerlo con alguna otra tecnología, no creo que puedas hacerlo con Javascript directo.