добавление ошибок к ошибкам формы Django .__ all__ - PullRequest
15 голосов
/ 10 февраля 2010

Как добавить ошибки в верхнюю часть формы после очистки данных? У меня есть объект, который должен выполнить вызов REST для внешнего приложения (карты Google) в качестве условия предварительного сохранения, и это может не произойти, а это значит, что мне нужно, чтобы мои пользователи исправили данные в форме. Поэтому я очищаю данные, а затем пытаюсь сохранить и добавить в форму ошибки, если сохранение не работает:

if request.method == "POST":
#clean form data
    try:
        profile.save()
        return HttpResponseRedirect(reverse("some_page", args=[some.args]))
    except ValueError:
        our_form.errors.__all__ = [u"error message goes here"]
return render_to_response(template_name, {"ourform": our_form,}, 
       context_instance=RequestContext(request))

Не удалось вернуть текст ошибки в моих модульных тестах (которые искали его в {{form.non_field_errors}}), а затем, когда я запускал его через отладчик, ошибки не были добавлены в формы ошибка, когда они достигают строки render_to_response, нигде в дереве our_form. Почему это не сработало? Как добавить ошибки в верхнюю часть формы после ее очистки?

Ответы [ 7 ]

18 голосов
/ 10 февраля 2010

Вы действительно хотите сделать это во время проверки формы и вызвать оттуда ошибку ValidationError ... но если вы настроены на это таким образом, вы захотите получить доступ к _errors для добавления новых сообщений. Попробуйте что-то вроде этого:

from django.forms.util import ErrorList

our_form._errors["field_name"] = ErrorList([u"error message goes here"])
12 голосов
/ 08 июля 2010

Ошибки, не связанные с полями, можно добавить, используя постоянный NON_FIELD_ERRORS ключ словаря (по умолчанию __all__):

from django import forms
errors = my_form._errors.setdefault(forms.forms.NON_FIELD_ERRORS, forms.util.ErrorList())
errors.append("My error here")
10 голосов
/ 04 ноября 2014

В Django 1.7 или выше я бы сделал:

form.add_error(field_name, "Some message")

Метод add_error был добавлен в 1,7. Переменная form - это форма, которой я хочу манипулировать, а field_name - это конкретное имя поля или None, если мне нужна ошибка, не связанная с конкретным полем.

В Django 1.6 я бы сделал что-то вроде:

from django.forms.forms import NON_FIELD_ERRORS

errors = form._errors.setdefault(field_name, form.error_class())
errors.append("Some message")

В приведенном выше коде form - это форма, которой я хочу манипулировать, а field_name - это имя поля, для которого я хочу добавить ошибку. field_name можно установить на NON_FIELD_ERRORS, чтобы добавить ошибку, не связанную с конкретным полем. Я использую form.error_class() для генерации пустого списка сообщений об ошибках. Вот как Django 1.6 внутренне создает пустой список, а не создает экземпляр ErrorList() напрямую.

9 голосов
/ 19 апреля 2011

Вы почти у цели своего оригинального решения. Вот базовый класс Form, который я построил, который позволяет мне делать то же самое, то есть добавлять в форму сообщения об ошибках без полей:

from django import forms
from django.forms.util import ErrorDict
from django.forms.forms import NON_FIELD_ERRORS 

class MyBaseForm(forms.Form):
    def add_form_error(self, message):
        if not self._errors:
            self._errors = ErrorDict()
        if not NON_FIELD_ERRORS in self._errors:
            self._errors[NON_FIELD_ERRORS] = self.error_class()
        self._errors[NON_FIELD_ERRORS].append(message)

class MyForm(MyBaseForm):
    ....

Все мои формы расширяют этот класс, поэтому я могу просто вызвать метод add_form_error (), чтобы добавить еще одно сообщение об ошибке.

9 голосов
/ 10 февраля 2010

Вы должны поднять ошибку проверки.

Почему бы не поставить проверку в чистом методе формы

class ProfileForm(forms.Form):
    def clean(self):
        try:
            #Make a call to the API and verify it works well
        except:
            raise forms.ValidationError('Your address is not locatable by Google Maps')

Таким образом, вам просто нужен стандартный form.is_valid() в представлении.

1 голос
/ 28 апреля 2010

Я не уверен, насколько ужасен этот взлом (до этого момента я действительно работал только над двумя проектами Django), но если вы сделаете что-то подобное, вы получите отдельное сообщение об ошибке, которое не связано с конкретное поле в модели:

form = NewPostForm()
if something_went_horribly_wrong():
  form.errors[''] = "You broke it!"
0 голосов
/ 27 апреля 2011

Если проверка относится к слою данных, то вам действительно не следует использовать проверку формы. Однако, начиная с Django 1.2, существует похожая концепция для моделей Django, и это, безусловно, то, что вы должны использовать. См. документацию для проверки модели .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...