Question

Je vois beaucoup de gens avec des applications Django qui ont uploads d'images redimensionnez automatiquement les images après leur téléchargement. C'est bien et bon pour certains cas, mais je ne veux pas le faire. Au lieu de cela, je veux simplement forcer l'utilisateur à télécharger un fichier qui est déjà la bonne taille.

Je veux avoir un ImageField où je force l'utilisateur à télécharger une image qui est 100x200. Si l'image est téléchargent pas exactement de cette taille, je veux que le formulaire d'administration pour revenir comme non valide. Je voudrais aussi pouvoir faire la même chose pour les rapports d'aspect. Je veux forcer l'utilisateur à télécharger une image 16:. 9 et rejeter toute téléchargement qui ne se conforme pas

Je sais déjà comment obtenir la largeur et la hauteur de l'image, mais je ne peux pas le faire côté serveur jusqu'à ce que l'image est déjà téléchargée, et la forme est transmis avec succès. Comment puis-je vérifier plus tôt, si possible?

Était-ce utile?

La solution

Le bon endroit pour le faire est lors de la validation du formulaire.
Un exemple rapide (éditera / intégration avec plus d'informations plus tard):

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)

Autres conseils

utiliser cette fonction dans votre fichier modèle,

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

Cela peut être dupe de / très similaire à cette question:

En utilisant jQuery, limitation de taille du fichier avant Transfert

Je ne pense pas qu'il y ait une façon de le faire de la façon dont vous voulez. solution Agos est la voie à suivre ...

Modifier L'une des réponses dans les SO liées question parle l'utilisation du flash pour le faire. Ainsi, alors qu'il est possible de faire avec une autre technologie, je ne pense pas que vous pouvez le faire avec javascript droit.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top