Внести ошибки в уже подтвержденную форму?

97

После form.Formпроверки введенных пользователем значений я передаю их в отдельный (внешний) процесс для дальнейшей обработки. Этот внешний процесс потенциально может найти дополнительные ошибки в значениях.

Есть ли способ ввести эти ошибки в уже проверенную форму, чтобы их можно было отобразить с помощью обычных методов отображения ошибок формы (или есть лучшие альтернативные подходы)?

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

Parand
источник

Ответы:

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? Я нахожусь в аналогичной ситуации с OP: у меня есть форма, в которой пользователи предоставляют новое имя, которое должно быть уникальным в базе данных. Если возникнет конфликт, я бы хотел отправить форму обратно с ошибкой, но я не узнаю, пока не попытаюсь вставить в базу данных. (Теоретически валидатор мог бы проверить базу данных, но это пахнет и предрасположено к расам.)
Weeble
1
@scompt: спасибо, исправлено. @Weeble: _errorsявляется частью API публичной формы, несмотря на его название; см. ответ insin для ссылки на документы.
Джон Милликин
18
Это невероятно непифонический. Насколько сложно было реализовать form.errors ['myfield']. Append (my_error) или form.add_error ('myfield', my_error)? Слишком много места для ошибок (без каламбура) в текущей реализации.
Michael
2
В основном полный. Еще одно замечание: если is_valid () не был вызван, вам нужно установить form._errors = ErrorDict ()
Джейкоб
12
@Michael - похоже, они последовали твоему совету ... Django Dev - Form.add_error (field, error)
Clayton
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
И, очевидно, в разрабатываемой версии post 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
Мухаммад Файзан Фарид
источник