Ich habe ein Django-Formular mit einem Benutzernamen und einem E-Mail-Feld. Ich möchte überprüfen, dass die E-Mail nicht bereits von einem Benutzer verwendet wird:
%Vor%Dies funktioniert, verursacht jedoch einige falsche negative Ergebnisse, da sich die E-Mail möglicherweise bereits in der Datenbank für den im Formular genannten Benutzer befindet. Ich möchte das ändern:
%Vor% Die Django-Dokumente sagen, dass die Validierung für ein Feld abgeschlossen ist, bevor das nächste Feld aufgerufen wird. Wenn die E-Mail vor dem Benutzernamen bereinigt wird, ist cleaned_data["username"]
nicht in clean_email
verfügbar. Aber die Dokumente sind unklar, in welcher Reihenfolge die Felder gereinigt werden. Ich erkläre den Benutzernamen vor der E-Mail im Formular. Bedeutet das, dass ich davon überzeugt bin, dass der Benutzername vor der E-Mail gelöscht wird?
Ich könnte den Code lesen, aber ich bin mehr daran interessiert, was die Django-API verspricht, und ich weiß, dass ich auch in zukünftigen Versionen von Django sicher bin.
Die Django-Dokumente behaupten, dass es in der Reihenfolge der Felddefinition ist.
Aber ich habe festgestellt, dass es diesem Versprechen nicht immer gerecht wird. Quelle: Ссылка
Diese Methoden werden in der Reihenfolge ausgeführt oben, ein Feld zu einer Zeit. Das ist für jedes Feld in der Form (in der Reihenfolge werden sie im Formular deklariert Definition), die Methode Field.clean () (oder seine Überschreibung) wird dann ausgeführt reinigen_(). Endlich einmal Diese beiden Methoden werden für jeden ausgeführt Feld, die Form.clean () -Methode oder ihre überschreiben, wird ausgeführt.
.keyOrder
funktioniert nicht mehr. Ich glaube, das sollte stattdessen funktionieren:
Es gibt Dinge, die die Reihenfolge ändern können, unabhängig davon, wie Sie sie in der Formulardefinition deklarieren. Eine davon ist, wenn Sie ModelForm
verwenden. In diesem Fall werden die beiden Felder in fields
unter class Meta
deklariert, wenn sie in einer unvorhersehbaren Reihenfolge sind.
Glücklicherweise gibt es eine zuverlässige Lösung .
self.fields.keyOrder
. Hier ist ein Beispielcode, den Sie verwenden können:
%Vor% Wenn keyOrder
gesetzt ist, wird has_custom_name
validiert (und daher in self.cleaned_data
), bevor name
validiert wird.
Es gibt kein Versprechen, dass die Felder in einer bestimmten Reihenfolge verarbeitet werden. Die offizielle Empfehlung lautet, dass jede Validierung, die von mehr als einem Feld abhängt, in der Methode clean()
des Formulars und nicht in den feldspezifischen clean_foo()
-Methoden erfolgen sollte.
Die clean () -Methode der Form-Unterklasse. Diese Methode kann beliebige ausführen Validierung, die Zugriff auf mehrere Felder aus dem Formular bei benötigt Einmal. Hier können Sie Dinge einsetzen, um zu überprüfen, ob das Feld A geliefert wird, muss Feld B eine gültige E-Mail-Adresse und dergleichen enthalten. Die Daten, die diese Methode zurückgibt, sind das letzte gereinigte_Datenattribut Für das Formular, vergessen Sie nicht, die vollständige Liste der bereinigten Daten zurückzugeben Wenn Sie diese Methode überschreiben (standardmäßig gibt Form.clean () nur zurück self.cleaned_data).
Kopieren-Einfügen von Ссылка
Dies bedeutet, dass wenn Sie überprüfen möchten, dass der Wert der E-Mail und der Parent-E-Mail nicht identisch sind, Sie dies innerhalb dieser Funktion tun sollten. das heißt:
%Vor%Tags und Links django validation