2009-09-24 13 views
11

Ho bisogno di aumentare un'eccezione nel metodo di salvataggio di un modello. Spero che esista un'eccezione che verrà catturata da qualsiasi django ModelForm che utilizza questo modello inclusi i moduli di amministrazione.Raising ValidationError dal metodo di salvataggio del modello django?

Ho provato ad aumentare django.forms.ValidationError, ma questo sembra non essere risolto dai moduli di amministrazione. Il modello effettua una chiamata di procedura remota al momento del salvataggio e non è noto fino a quando questa chiamata non è valida.

Grazie, Pete

risposta

8

Non c'è attualmente alcun modo di effettuare la validazione nel modello Salva metodi. Questo è tuttavia in fase di sviluppo, come un ramo di convalida del modello separato, e dovrebbe essere fuso in tronco nei prossimi mesi.

Nel frattempo, è necessario eseguire la convalida a livello di modulo. È abbastanza semplice creare una sottoclasse ModelForm con un metodo clean() che effettua la chiamata remota e solleva di conseguenza l'eccezione e utilizzarla sia nell'amministratore sia come base per gli altri moduli.

+3

Il django mi ha picchiato recentemente. Sono andato con questo approccio, ma non sono soddisfatto. Il codice che modifica un modello non appartiene a un metodo pulito. – slypete

+0

Basta fare il check in, questa filiale di cui hai parlato è già stata inserita? – rennat

+5

Fa parte di Django 1.2: http://docs.djangoproject.com/en/dev/ref/models/instances/#validating-objects – Tom

10

Dal Django 1.2, questo è quello che ho fatto:

class MyModel(models.Model): 

    <...model fields...> 

    def clean(self, *args, **kwargs): 
     if <some constraint not met>: 
      raise ValidationError('You have not met a constraint!') 
     super(MyModel, self).clean(*args, **kwargs) 

    def full_clean(self, *args, **kwargs): 
     return self.clean(*args, **kwargs) 

    def save(self, *args, **kwargs): 
     self.full_clean() 
     super(MyModel, self).save(*args, **kwargs) 

Questo ha il vantaggio di lavorare sia all'interno che all'esterno di admin.

Problemi correlati