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,FormView.form_invalid() discards its form argument resulting in duplicated validation,Antoine Catton,Andrew Artajos,"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 propose 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.",Cleanup/optimization,closed,Generic views,dev,Normal,fixed,performance FormView form_invalid,,Ready for checkin,1,0,0,1,1,0