2011-12-22 12 views
8

Mam formularz z kilkoma polami. Mam oddzielne sprawdzanie poprawności dla każdego pola, wykonane za pomocą walidacji formularzy. Muszę jednak również sprawdzić, czy kilka pól jest wypełnionych przed przekierowaniem użytkownika do innego widoku. Miałem nadzieję, że uda mi się jakoś dopisać błąd do forms.non_field_errors, ponieważ nie jest on dla konkretnego pola, ale nie jestem pewien, jaka byłaby właściwa składnia tego. Sprawdziłem w Internecie i znalazłem ..Jak dołączyć komunikat o błędzie do formularza.non_field_errors w django?

form.errors['__all__'] = form.error_class(["error msg"]) 

Spowoduje to wyświetlenie komunikatu o błędzie, ale wydaje się bałagan innych stron, jak również i displyas komunikat o błędzie, jeśli kliknę na cokolwiek innego.

Próbowałem

form._errors[NON_FIELD_ERRORS] = form.error_class() 

Powoduje Object 'NoneType' nie ma atrybutu 'setDefault' błędu dla mnie.

Próbowałem

form.non_field_errors().append("Please complete your profile in order to access the content.") 

To nie wydaje się zrobić wszystko i nie mogę zobaczyć komunikat o błędzie na widoku.

Jaki byłby najlepszy sposób na zrobienie tego? Idealnie nie chcę tego robić w czystej formie formularza. Czuję, że powinienem być w stanie dołączyć błąd do formularza w widoku.

Odpowiedz

17
  1. połączeń full_clean(), to powinien zainicjować form._errors. Ten krok jest krytyczny, jeśli tego nie zrobisz, to nie zadziała.

  2. Zrób listę błędów, że ma listę komunikatów, instanciate go jako takie: error_list = form.error_class(['your error messages'])

  3. Przypisywanie listę błędzie NON_FIELD_ERRORS, trzeba importować NON_FIELD_ERRORS z django.forms.forms, a następnie przypisać jako takie: form._errors[NON_FIELD_ERRORS] = error_list

Oto demonstracja z powłoki:

In [1]: from bet.forms import BetForm 

In [2]: from django.forms.forms import NON_FIELD_ERRORS 

In [3]: form = BetForm() 

In [4]: form.full_clean() 

In [5]: form._errors[NON_FIELD_ERRORS] = form.error_class(['your error messages']) 

In [6]: form.non_field_errors() 
Out[6]: [u'your error messages'] 
+0

Wiem, że mogę to zrobić w metodzie Form.clean().Jednak wolałbym zrobić to w widoku i tylko dołączyć błąd do listy form.errors, czy to w ogóle możliwe? – Angela

+0

No tak, jest to możliwe, moja odpowiedź to potwierdza :) – jpic

+0

Dziękuję jpic za szczegółową odpowiedź. Wypróbuję ten kod i wrócę. Przepraszam za spóźnioną odpowiedź, byłem na wyjeździe na wakacje. – Angela

4

To jest trochę przestarzałe, ale ostatnio wpadłem na to samo pytanie i chciałem rzucić nieco światła na to dla przyszłych czytelników.

  1. W Django 1.6 + słownika błędy są zapisywane jako form.errors a nie form._errors
  2. Jeśli instancję form.is_valid(), jest to równoznaczne z systemem full_clean()
  3. NON_FIELD_ERRORS nie jest konieczne, aby importować, wystarczy odwołać się do swojego domyślnego klucza Słownik __all__

Przykład:

if form.is_valid(): 
    form.errors['__all__'] = form.error_class(['Your Error Here!']) 
+3

Na ogół lepiej jest używać zdefiniowanych stałych, tj. 'NON_FIELD_ERRORS' ponad swoją wartością' __all__'. Ponadto, o ile rozumiem, punkt ustawiania błędów innych niż pola ** przed ** wywołaniem 'is_valid()' jest w stanie wpłynąć na wynik 'is_valid()'. – jpic

+0

Zgadzam się z częścią stałą NON_FIELD_ERRORS, chciałem tylko wskazać alternatywę. Co do ustawiania błędów innych niż pola, starałem się powiedzieć, że błędy inne niż pola nie są tworzone, chyba że w ogóle wywoływana jest funkcja is_valid() lub full_clean(). Jeśli spróbujesz przystąpienia przed uruchomieniem którejkolwiek metody, otrzymasz KeyError. Chyba, że ​​próbujesz powiedzieć, że należy uruchomić full_clean() przed uruchomieniem is_valid()? – asaji

+0

To jest pełne dezinformacji: form.errors to właściwość, która uzyskuje dostęp do wewnętrznej listy form._errors. Dobrą praktyką jest używanie NON_FIELD_ERRORS jako stałej, ponieważ programiści mogą pewnego dnia nagle zdecydować, że stała powinna być równoważna ciągowi "_la_le_loo_". Dlatego mamy stałe w językach - dzięki czemu możemy łatwiej i łatwiej korygować nasz kod. Ponadto form.is_valid() nie jest równoważne uruchomieniu full_clean(). is_valid() wywołuje form.errors, który wywołuje full_clean, aby wypełnić słownik _errors. – Bobort

0

self._errors.setdefault('__all__', ErrorList()).extend([""])

Powiązane problemy