2008-10-09 14 views
80

Nachdem meine die Benutzereingabewerte validiert hat, gebe ich sie zur weiteren Verarbeitung an einen separaten (externen) Prozess weiter. Dieser externe Prozess kann möglicherweise weitere Fehler in den Werten finden.Fehler in bereits validierte Form einspeisen?

Gibt es eine Möglichkeit, diese Fehler in das bereits validierte Formular zu injizieren, so dass sie über die üblichen Formularfehleranzeige-Methoden angezeigt werden können (oder gibt es bessere alternative Ansätze)?

Ein Vorschlag bestand darin, die externe Verarbeitung in die Formularvalidierung aufzunehmen, was nicht ideal ist, da der externe Prozess viel mehr als nur eine Validierung durchführt.

Antwort

84

Form._errors kann wie ein Standard-Wörterbuch behandelt werden. Es ist eine gute Form als die ErrorList Klasse zu verwenden, und Fehler der bestehenden Liste anhängen:

from django.forms.util import ErrorList 
errors = form._errors.setdefault("myfield", ErrorList()) 
errors.append(u"My error here") 

Und wenn Sie nicht-Feldfehler hinzufügen möchten, verwenden Sie django.forms.forms.NON_FIELD_ERRORS (Standardeinstellung "__all__") statt "myfield".

+0

Um zu entsprechen, was Django ist In diesem Fall sollten Sie ErrorList-Objekte einfügen. –

+1

Dies erscheint ein wenig unangenehm, da der Name "_errors" andeutet, dass es innerhalb der Formularklasse intern sein soll. Ist das der übliche Weg, dies in Django zu tun? Ich bin in einer ähnlichen Situation wie das OP: Ich habe ein Formular, wo Benutzer einen neuen Namen angeben, der in der Datenbank eindeutig sein muss. Wenn es eine Kollision gibt, möchte ich das Formular mit einem Fehler zurücksenden, aber ich werde es nicht wissen, bis ich tatsächlich versuche, die Datenbank einzufügen. (Theoretisch könnte der Validator die Datenbank überprüfen, aber das riecht und ist rennanfällig.) – Weeble

+1

@scompt: Danke, behoben. @Weeble: '_errors' ist trotz seines Namens Teil der API des öffentlichen Formulars; In Insins Antwort finden Sie einen Dokumentationslink. –

14
+5

Und anscheinend in der Post 1.6 Entwicklerversion, sie sind das Hinzufügen eines 'add_error' Funktion: https://docs.djangoproject.com/en/dev/ref/forms/api/#django .forms.Form.add_error – brianmearns

+0

Und jetzt hat Django 1.7 eine offizielle add_error Funktion: https://docs.djangoproject.com/en/1.7/ref/forms/api/#django.forms.Form.add_error –

Verwandte Themen