Fehler in bereits validierte Form einfügen?

97

Nach meinen form.Form die Benutzereingabewerte überprüft habe, übergebe ich sie zur weiteren Verarbeitung an einen separaten (externen) Prozess. Dieser externe Prozess kann möglicherweise weitere Fehler in den Werten finden.

Gibt es eine Möglichkeit, diese Fehler in das bereits validierte Formular einzufügen, damit sie über die üblichen Methoden zur Anzeige von Formularfehlern angezeigt werden können (oder gibt es bessere alternative Ansätze)?

Ein Vorschlag war, die externe Verarbeitung in die Formularvalidierung einzubeziehen, was nicht ideal ist, da der externe Prozess viel mehr als nur eine Validierung bewirkt.

Parand
quelle

Antworten:

92

Form._errorskann wie ein Standardwörterbuch behandelt werden. Es wird als gute Form angesehen, die ErrorListKlasse zu verwenden und Fehler an die vorhandene Liste anzuhängen:

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

Wenn Sie Fehler außerhalb des Felds hinzufügen möchten, verwenden Sie stattdessen django.forms.forms.NON_FIELD_ERRORS(standardmäßig "__all__") "myfield".

John Millikin
quelle
2
Dies scheint ein wenig unangenehm zu sein, da der Name "_errors" darauf hindeutet, dass es sich innerhalb der Formularklasse befinden soll. Ist das die Standardmethode in Django? Ich bin in einer ähnlichen Situation wie das OP: Ich habe ein Formular, in dem 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
1
@scompt: danke, behoben. @Weeble: _errorsist trotz seines Namens Teil der öffentlichen Formular-API; Siehe Insins Antwort für einen Dokument-Link.
John Millikin
18
Das ist unglaublich nicht pythonisch. Wie schwer war es, form.errors ['myfield']. Append (my_error) oder form.add_error ('myfield', my_error) zu implementieren? Zu viel Raum für Fehler (kein Wortspiel beabsichtigt) in der aktuellen Implementierung.
Michael
2
Meistens vollständig. Eine zusätzliche Anmerkung ist, dass, wenn is_valid () nicht aufgerufen wurde, Sie form._errors = ErrorDict ()
jacob
12
@ Michael - sieht so aus, als hätten sie Ihren Rat befolgt
Clayton
14

Sie können dem _errorsAttribut des Formulars direkt zusätzliche Fehlerdetails hinzufügen :

https://docs.djangoproject.com/de/1.5/ref/forms/validation/#described-later https://docs.djangoproject.com/de/1.6/ref/forms/validation/#modifying-field-errors

Jonny Buchanan
quelle
6
Und anscheinend fügen sie in der Post 1.6-Entwicklungsversion eine add_errorFunktion hinzu: docs.djangoproject.com/de/dev/ref/forms/api/…
brianmearns
Und jetzt hat Django 1.7 eine offizielle Funktion add_error: docs.djangoproject.com/de/1.7/ref/forms/api/…
Danilo Cabello
0

Fehler zu einem bestimmten Feld hinzufügen:

form.add_error('fieldName', 'error description')

** Fehler zu Nichtfeldern hinzufügen **

form.add_error(None, 'error description')
#Only pass None instead of field name
Muhammad Faizan Fareed
quelle