Wprowadzić błędy do już zweryfikowanego formularza?

97

Po form.Formzweryfikowaniu wartości wprowadzonych przez użytkownika przekazuję je do oddzielnego (zewnętrznego) procesu do dalszego przetwarzania. Ten zewnętrzny proces może potencjalnie znaleźć dalsze błędy w wartościach.

Czy istnieje sposób na wprowadzenie tych błędów do już sprawdzonego formularza, aby można je było wyświetlić za pomocą zwykłych metod wyświetlania błędów formularza (lub czy istnieją lepsze podejścia alternatywne)?

Jedną z sugestii było włączenie przetwarzania zewnętrznego do walidacji formularza, co nie jest idealne, ponieważ proces zewnętrzny robi dużo więcej niż tylko walidację.

Parand
źródło

Odpowiedzi:

92

Form._errorsmożna traktować jak standardowy słownik. Używanie ErrorListklasy i dołączanie błędów do istniejącej listy jest uważane za dobrą formę :

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

A jeśli chcesz dodać błędy inne niż pola, użyj django.forms.forms.NON_FIELD_ERRORS(domyślnie "__all__") zamiast "myfield".

John Millikin
źródło
2
Wydaje się to trochę nieprzyjemne, ponieważ nazwa „_errors” sugeruje, że ma to być wewnętrzna klasa formularza. Czy to standardowy sposób na zrobienie tego w Django? Jestem w podobnej sytuacji co OP: mam formularz, w którym użytkownicy podają nową nazwę, która musi być unikalna w bazie danych. Jeśli wystąpi kolizja, chciałbym odesłać formularz z błędem, ale nie dowiem się, dopóki nie spróbuję wstawić do bazy danych. (Teoretycznie walidator mógłby sprawdzić bazę danych, ale to pachnie i jest podatne na wyścigi).
Weeble
1
@scompt: dzięki, naprawiono. @Weeble: _errorsjest częścią publicznego API formularza, pomimo swojej nazwy; zobacz odpowiedź firmy Insin na link do dokumentów.
John Millikin
18
To niewiarygodnie nie-pythonowe. Jak trudno było zaimplementować form.errors ['myfield']. Append (my_error) lub form.add_error ('myfield', my_error)? Za dużo miejsca na błędy (gra słów nie jest zamierzona) w obecnej implementacji.
Michael
2
W większości kompletne. Dodatkową informacją jest to, że jeśli is_valid () nie zostało wywołane, musisz ustawić form._errors = ErrorDict ()
jacob
12
@Michael - wygląda na to, że skorzystali z Twojej rady ... Django Dev - Form.add_error (pole, błąd)
Clayton
0

Dodaj błąd do określonego pola:

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

** Dodaj błąd do pól innych niż **

form.add_error(None, 'error description')
#Only pass None instead of field name
Muhammad Faizan Fareed
źródło