﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
25548	Can't Form.add_error() in FormView.form_valid()	Antoine Catton	nobody	"Let's consider this example:

{{{#!python
class MyView(FormView):
    def form_valid(self, form):
        value = form.cleaned_data['value']
        try:
            do_action(value)
        except ValueError as e:
            form.add_error(None, e.message)
            return self.form_invalid(form)
        return super().form_valid(form)
}}}

The error message is ignored. The main reason being that the form in discarded in `FormView.form_invalid()`. Here's the current implementation on master:

{{{#!python
    def form_invalid(self, form):
        """"""
        If the form is invalid, re-render the context data with the
        data-filled form and errors.
        """"""
        return self.render_to_response(self.get_context_data())
 }}}

I proposed to modify this implementation to:

{{{#!python
    def form_invalid(self, form):
        return self.render_to_response(self.get_context_data(form=form))
}}}

since `Form.get_context_data()` is doing `kwargs.setdefault('form', self.get_form())`. I did that on my view, but it does feel this is something that belongs in Django.

Also, from my little understanding of the code, this also mean that if I have a form like this:

{{{#!python
class MyForm(Form):
    def clean_value(self):
        value = self.cleaned_data['value']
        try:
            heavy_computation(value)
        except ValueError as e:
            raise ValidationError(e.message)
        return value
}}}

The `heavy_computation()` is going run twice."	Uncategorized	new	Generic views	dev	Normal		performance FormView form_invalid		Unreviewed	1	0	0	0	1	0
