﻿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
22469	FormView override render_to_response (JSON-response)	m.vovcu@…	nobody	"Hi,

I'm rewriting an application of mine to user CBV instead of functions. I stuck at a point where I wanted to return a JSON response inside the form_invalid function but always got a ''view didn't return an HttpResponse object''-error. Therefore I thought to myself to try it inside the post function where it suddenly worked. 

To spare us words, here's my setup (simplified for better readability):

== urls.py: ==
url( r'^plans/$', login_required( MainView.as_view(
                                context_object_name='services',
                                model = Service,
                                template_name = 'plans.html',
                                paginate_by = 5,
                                form_class = addServiceForm,
                                success_url = reverse_lazy('plans')) ),
                            name=""plans"" ),

== views.py: ==
class MainView(ListView, FormMixin):
    # NOTICE: I put this only here for completion
    def get(self, request, *args, **kwargs):
        view = DefView.as_view( context_object_name=self.context_object_name, model=self.model, queryset=self.queryset, template_name=self.template_name, paginate_by=self.paginate_by, form_class=self.form_class, success_url=self.success_url )
        return view(request, *args, **kwargs)

    # NOTICE: here's our patient
    def post(self, request, *args, **kwargs):
        view = SubTestView.as_view( template_name=self.template_name, form_class=self.form_class, success_url=self.success_url )

#'''This one does NOT work'''
class SubTestView(FormView):

    def render_to_json_response(self, context, **response_kwargs):
        data = json.dumps(context)
        response_kwargs['content_type'] = 'application/json'
        return HttpResponse(data, **response_kwargs)

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        self.form_invalid(form)

    def form_invalid(self, form):
        data = {
                'pk': ""Test_PK"",
            }
        return self.render_to_json_response(data)


#'''This one DOES work'''
class SubTestView(FormView):

    def render_to_json_response(self, context, **response_kwargs):
        data = json.dumps(context)
        response_kwargs['content_type'] = 'application/json'
        return HttpResponse(data, **response_kwargs)

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        data = {
                'pk': ""Test_PK"",
            }
        return self.render_to_json_response(data)


Well, regarding the code I don't really see any difference. Am I doing something wrong or is this just a bug?

Tested with following setups:
OSX 10.9.2, Python 2.7/3.3/3.4, Django 1.6.2/1.5


Regards
marius"	Uncategorized	closed	Generic views	1.6	Normal	needsinfo	CBV, FormView		Unreviewed	0	0	0	0	0	0
