Veo que muchas personas con aplicaciones de Django que tienen cargas de imágenes cambian automáticamente el tamaño de las imágenes después de cargarlas. Eso está muy bien para algunos casos, pero no quiero hacer esto. En cambio, simplemente quiero obligar al usuario a cargar un archivo que ya tiene el tamaño adecuado.

Quiero tener un ImageField donde obligue al usuario a cargar una imagen de 100x200. Si la imagen que cargan no es exactamente de ese tamaño, quiero que el formulario de administrador vuelva como no válido. También me gustaría poder hacer lo mismo para las relaciones de aspecto. Quiero obligar 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 del lado del servidor hasta que la imagen ya esté cargada y el formulario se haya enviado correctamente. ¿Cómo puedo verificar esto antes, si es posible?

23
Apreche 9 dic. 2009 a las 20:02

3 respuestas

La mejor respuesta

El lugar correcto para hacer esto es durante la validación del formulario.
Un ejemplo rápido (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)
53
Flimm 21 dic. 2016 a las 08:29

Esto puede ser un engaño de / muy similar a esta pregunta:

Usando jQuery, restringiendo el tamaño del archivo antes de cargar

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

Editar: Una de las respuestas en la pregunta SO vinculada se refiere al uso de flash para hacerlo. Entonces, si bien es posible hacerlo con alguna otra tecnología, no creo que pueda hacerlo con JavaScript directo.

-1
Community 23 may. 2017 a las 12:18

Use esta función en su 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')
3
M.javid 28 abr. 2019 a las 13:06