2009-09-24 9 views
11

Ich muss eine Ausnahme in der Speichermethode eines Modells auslösen. Ich hoffe, dass eine Ausnahme existiert, die von jedem Django ModelForm gefangen wird, der dieses Modell einschließlich der Admin-Formulare verwendet.ValidationError von der Speichermethode des Django-Modells ausgelöst?

Ich versuchte, django.forms.ValidationError zu erhöhen, aber dies scheint von den Admin-Formularen nicht aufgefangen zu werden. Das Modell führt einen Remote-Prozeduraufruf zum Zeitpunkt der Speicherung durch, und es ist bis zu diesem Aufruf nicht bekannt, ob die Eingabe gültig ist.

Danke, Pete

Antwort

8

Es gibt derzeit keine Möglichkeit, Validierung Modell speichern Methoden durchzuführen. Dies wird jedoch als separater Modellvalidierungszweig entwickelt und sollte in den nächsten Monaten in Trunk zusammengeführt werden.

In der Zwischenzeit müssen Sie die Validierung auf Formularebene durchführen. Es ist ganz einfach, eine ModelForm Unterklasse mit einer clean() Methode zu erstellen, die Ihren Remote-Aufruf durchführt und die Ausnahme entsprechend auslöst, und diese sowohl im Admin als auch als Basis für Ihre anderen Formulare verwendet.

+3

Django hat mich in letzter Zeit bumsten. Ich ging mit diesem Ansatz, aber ich bin nicht zufrieden. Code, der ein Modell ändert, gehört nicht zu einer sauberen Methode. – slypete

+0

Einfach einchecken, ist dieser Zweig, über den Sie gesprochen haben, schon zusammengelegt? – rennat

+5

Es ist Teil von Django 1.2: http://docs.djangoproject.com/en/dev/ref/models/instances/#validating-objects – Tom

10

Da Django 1.2, ist es das, was ich getan habe:

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) 

Dies hat den Vorteil, sowohl innerhalb als auch außerhalb von Admin arbeiten.

Verwandte Themen