2011-09-30 17 views
6

Ho un metodo pulito personalizzato di seguito:Django convalidare ImageField dimensioni ecc

def clean_image(self): 
    image = self.cleaned_data['image'] 
    if image: 
     from django.core.files.images import get_image_dimensions 
     w, h = get_image_dimensions(image) 
     if not image.content_type in settings.VALID_IMAGE_FORMATS: 
      raise forms.ValidationError(u'Only *.gif, *.jpg and *.png images are allowed.') 
     if w > settings.VALID_IMAGE_WIDTH or h > settings.VALID_IMAGE_HEIGHT: 
      raise forms.ValidationError(u'That image is too big. The image needs to be ' + str(settings.VALID_IMAGE_WIDTH) + 'px * ' + str(settings.VALID_IMAGE_HEIGHT) + 'px (or less).') 
     return image 

Lo scenario problema è questo:

L'immagine è stata caricata. Ora voglio cancellarlo usando la casella di controllo che appare usando il widget ImageField. Quando si invia il modulo per rendere chiaro ciò, il chiaro no.

Se rimuovo il mio metodo pulito personalizzato, il clear funziona. Quindi immagino che il mio metodo stia facendo qualcosa di sbagliato.

+3

provare annullare il rientro il ritorno in modo che sia in linea con l'istruzione if , cioè restituisce sempre i dati. –

risposta

0

Penso che non restituisca l'immagine da clean_data. Dovresti controllarlo, perché la tua codifica sembra a posto.

9

Ci sono 3 problemi quando Django rendono conto di questo convalide:

  1. Django hanno bisogno di ottenere il valore di questi campi, sempre bisogno di restituire un valore
  2. Hai bisogno di mettere classe Meta con il nome del modello è stato utilizzato.
  3. In queste frasi sono tenuti a mettere .get questo modo

    self.cleaned_data.get['image'] 
    
  4. Il codice è simile al seguente:

    class Meta: 
        model = NameModel  
    
    def clean_image(self): 
        image = self.cleaned_data.get['image'] 
        if image: 
         from django.core.files.images import get_image_dimensions 
         w, h = get_image_dimensions(image) 
         if not image.content_type in settings.VALID_IMAGE_FORMATS: 
          raise forms.ValidationError(u'Only *.gif, *.jpg and *.png images are allowed.') 
         if w > settings.VALID_IMAGE_WIDTH or h > settings.VALID_IMAGE_HEIGHT: 
          raise forms.ValidationError(u'That image is too big. The image needs to be ' +  str(settings.VALID_IMAGE_WIDTH) + 'px * ' + str(settings.VALID_IMAGE_HEIGHT) + 'px (or less).') 
        return image 
    
+0

Il punto 1 è la risposta qui - è necessario assicurarsi che 'clean_image' restituisca un valore, questo permette che la funzione di clear admin di Django si verifichi. – jamesc

+1

Stavo ottenendo errori "Not subscriptable" fino a quando ho modificato quanto sopra in 'image = self.cleaned_data ['image']' – shacker

Problemi correlati