Вводити помилки у вже перевірену форму?


97

Після того, як я form.Formпідтверджує введені користувачем значення, я передаю їх окремому (зовнішньому) процесу для подальшої обробки. Цей зовнішній процес може потенційно знайти додаткові помилки у значеннях.

Чи є спосіб ввести ці помилки у вже затверджену форму, щоб їх можна було відобразити за допомогою звичайних методів відображення помилок форми (чи є кращі альтернативні підходи)?

Однією з пропозицій було включити зовнішню обробку до перевірки форми, що не є ідеальним, оскільки зовнішній процес робить набагато більше, ніж просто валідація.

Відповіді:


92

Form._errorsможе трактуватися як стандартний словник. Вважається гарною формою використання ErrorListкласу та додавання помилок до існуючого списку:

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

І якщо ви хочете додати помилки, що не поля, використовуйте django.forms.forms.NON_FIELD_ERRORS(за замовчуванням "__all__") замість "myfield".


2
Це здається трохи неприємним, оскільки назва "_errors" передбачає, що вона повинна бути внутрішньою для класу форми. Це стандартний спосіб зробити це в Django? Я потрапив у ситуацію, подібну до ОП: у мене є форма, де користувачі надають нову назву, яка повинна бути унікальною в базі даних. Якщо виникне зіткнення, я хотів би відправити форму назад із помилкою, але я не буду знати, доки не спробую виконати вставку бази даних. (Теоретично валідатор міг перевірити базу даних, але це пахне і схильне до раси.)
Weeble

1
@scompt: дякую, виправлено. @Weeble: _errorsє частиною API загальнодоступної форми, незважаючи на свою назву; див. відповідь insin для посилання на документи.
Джон Міллікін,

18
Це неймовірно не пітонічно. Наскільки важко було реалізувати form.errors ['myfield']. Append (my_error) або form.add_error ('myfield', my_error)? Багато місця для помилок (без каламбуру) в поточній реалізації.
Майкл

2
В основному повний. Одним додатковим зауваженням є те, що якщо is_valid () не було викликано, то вам потрібно буде встановити form._errors = ErrorDict ()
jacob

12
@Michael - схоже, вони взяли вашу пораду ... Django Dev - Form.add_error (поле, помилка)
Клейтон


14

Ви можете додати додаткові деталі помилок _errorsбезпосередньо до атрибута форми :

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


6
І, мабуть, у версії для розробки після 1.6 вони додають add_errorфункцію: docs.djangoproject.com/en/dev/ref/forms/api/…
brianmearns

І тепер Django 1.7 має офіційну функцію add_error
Даніло Кабелло

0

Додати помилку до конкретного поля:

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

** Додати помилку до не поля **

form.add_error(None, 'error description')
#Only pass None instead of field name
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.