Wie überprüfe ich den Wertübergang in Django (django-admin)?

8

Ich habe ein Statusfeld mit 3 Werten: ausstehend, aktiviert und abgelehnt. Wenn ich den Statuswert ändere, den ich möchte Überprüfen Sie, dass die Aktivierung nicht in "Ausstehend" geändert werden kann. ich Ich möchte dafür keine Stored-Procs schreiben. Kann ich die ... haben vorheriger Wert in Django vor dem Speichern?

Bedeutet neuen und alten Wert.

    
ha22109 03.08.2009, 12:30
quelle

5 Antworten

10
%Vor%

Diese Methode soll in einer Form Unterklasse hinzugefügt werden. Sein Name ist clean_FIELD_NAME .

cleaned_data enthält vorherige Werte. Ein neuer Wert wird in self.instance gespeichert.

Alternativ kann validate() method zu einer forms.Field -Unterklasse hinzugefügt werden. Siehe Django-Dokumentation.

    
ha22109 06.06.2012, 11:26
quelle
8

Sie können dies in einer überschriebenen Methode save tun. Zu beachten ist, dass Django-Modellinstanzen nicht die eigentlichen Datenbankobjekte sind, sondern nur ihre Werte von dort beim Laden erhalten. So können Sie einfach zurück in die Datenbank gehen, bevor Sie Ihr aktuelles Objekt speichern, um die vorhandenen Werte zu erhalten.

%Vor%

Es gibt derzeit keine gute Möglichkeit, eine Fehlermeldung an den Benutzer zu senden, außer dass eine Ausnahme ausgelöst wird. Derzeit läuft ein Google Summer of Code-Projekt, um eine "Modellvalidierung" zu ermöglichen, die jedoch erst in einigen Monaten abgeschlossen sein wird.

Wenn Sie im Admin etwas Ähnliches tun wollen, ist es am besten, ein benutzerdefiniertes ModelForm mit einer überschriebenen Methode clean() zu definieren. Allerdings haben Sie dieses Mal, da dies eine Form ist, bereits Zugriff auf die alten Werte, ohne die db erneut zu treffen. Ein weiterer Vorteil ist, dass Sie einen Formulargültigkeitsfehler an den Benutzer zurückgeben können.

%Vor%     
Daniel Roseman 15.05.2009 06:35
quelle
1

Dies wurde an anderer Stelle in Stack Overflow beantwortet, aber der richtige Weg besteht darin, etwas wie dies zu verwenden, um nachzusehen, ob Felder vorhanden sind sind dreckig. Dann könnten Sie ein Signal verwenden, um anzuzeigen, dass sich etwas geändert hat, das von Bedeutung ist. (d. h. Ihr Feld)

    
Dan Ostrowski 18.03.2012 12:02
quelle
0

Anstatt die Speichermethode zu überschreiben, wäre dies nicht ein guter Ort, um Signale zu verwenden? Die Sicherung vor dem Festschreiben abfangen, den aktuellen Wert in der Datenbank überprüfen und das Speichern entweder weiterleiten oder ablehnen?

Jetzt bin ich mir nicht sicher, ob das Signal die Speicheranforderung blockiert oder ob es asynchron geschieht. Sie können also diese Antwort ablehnen, wenn ein Signal nicht verwendet werden kann, um das Speichern bei der Validierung zu verhindern.

Ich bin dagegen, eingebaute Methoden zu überschreiben, wenn es ein anderes integriertes Werkzeug gibt, das genauso gut funktioniert.

    
Josh Smeaton 15.05.2009 10:47
quelle
0

Dieser Thread wurde gefunden, als nach einer Antwort auf dieselbe Frage gesucht wurde. Warum nicht so etwas tun? Auf diese Weise können Sie vermeiden, die Datenbank zu berühren. Und eingebaut __init__ nur ein wenig erweitert. Ich denke, es ist viel einfacher als die Verwendung von Signalen.

%Vor%     
jetfix 26.10.2012 05:56
quelle