2012-10-09 16 views
6

Cercando di risolvere un problema interessante in questo momento.Django ModelForm Validation

Ho un modello Django con un campo image non richiesto, ma è impostato su un valore predefinito quando viene creata una nuova istanza di modello.

class Product(models.Model): 
    image = models.ImageField(upload_to='/image/directory/', default='/default/image/path/', blank=True) 

ho anche un ModelForm sulla base di quel modello, che include il campo image, e che ha un po 'di convalida personalizzata.

class ProductForm(forms.ModelForm): 
    class Meta: 
     model = Product 
     fields = ('image',) 

    def clean_image(self): 
     image = self.cleaned_data.get('image', False) 
     if image: 
      # validate image 
     return None 

Il problema è che per the docs, chiamando is_valid() su un ModelForm trigger validazione dei modelli, oltre a formare la convalida, in modo che quando un utente invia il modulo tipo senza immagine, il mio codice di convalida modulo personalizzato tenta di convalidare il modello predefinito immagine, piuttosto che non fare nulla come dovrebbe.

Come faccio a non fare nulla a meno che il modulo stesso non abbia un valore per il campo image?

+0

'blank = True' è una convalida a livello di database e' null = True' è una convalida a livello di modello, quindi è necessario aggiungere anche 'null = True'. – karthikr

+3

@karthikr: Non è vero. 'null è puramente correlato al database, mentre vuoto è correlato alla validazione. Se un campo ha spazio = True, la convalida del modulo consentirà l'inserimento di un valore vuoto. Se un campo ha vuoti = Falso, il campo sarà richiesto. [Maggiori informazioni qui.] (Https://docs.djangoproject.com/en/dev/ref/models/fields/#blanko) –

+2

@karthikr Penso che potresti voler ricontrollare questo. Da docs 'null è puramente correlato al database, mentre vuoto è correlato alla validazione. Https://docs.djangoproject.com/en/dev/ref/models/fields/#field-options –

risposta

10

Appena risolto in modo abbastanza semplice. Aggiungere la risposta qui nel caso in cui sia utile a chiunque altro.

The Django docs state that

... un'istanza forma modello associata a un oggetto del modello conterrà un attributo self.instance che dà metodi di modulo modello di accesso a tale caso specifico modello.

Quindi, piuttosto che controllare se lo ModelForm ha un valore immagine, ho solo controllato se il valore dell'immagine è cambiato dall'istanza salvata. La convalida del modulo ora appare così:

class ProductForm(forms.ModelForm): 
    class Meta: 
     model = Product 
     fields = ('image',) 

    def clean_image(self): 
     image = self.cleaned_data.get('image', False) 
     if not self.instance.image == image: 
      # validate image 
     return None 

Problema risolto!

Problemi correlati