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.
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.
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.
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.
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)
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.
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.
Tags und Links django django-forms django-admin