Kann ich auf die Reihenfolge der Feldüberprüfung in einem Django-Formular zählen?

8

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.

    
Ned Batchelder 21.07.2010, 13:01
quelle

4 Antworten

7

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.

    
Wolph 21.07.2010, 13:14
quelle
8

Aktualisieren

.keyOrder funktioniert nicht mehr. Ich glaube, das sollte stattdessen funktionieren:

%Vor%

Vorherige Antwort

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 .

Sie können die Feldreihenfolge in einem Formular steuern, indem Sie self.fields.keyOrder .

festlegen

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.

    
Jordan Reiter 22.03.2012 20:08
quelle
6

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.

    
Daniel Roseman 21.07.2010 13:11
quelle
1
  

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%     
Harph 21.06.2012 17:54
quelle

Tags und Links